Compare commits
27 Commits
71ab2b999c
...
01ee5a81e5
Author | SHA1 | Date |
---|---|---|
Valentino Orlandi | 01ee5a81e5 | |
Valentino Orlandi | 1cb69b0a31 | |
Valentino Orlandi | 9abeab6257 | |
Valentino Orlandi | bd8f40802a | |
Valentino Orlandi | 601862c2a0 | |
Valentino Orlandi | 2da551b4c0 | |
Valentino Orlandi | 997d1c8eb3 | |
Valentino Orlandi | 225110473a | |
Valentino Orlandi | 4339d0366e | |
Valentino Orlandi | d2115ce3e0 | |
Valentino Orlandi | 4dbfc272be | |
Valentino Orlandi | e59d5fcf27 | |
Valentino Orlandi | 88f4c899b1 | |
Valentino Orlandi | be433248ef | |
Valentino Orlandi | 969666f4b2 | |
Valentino Orlandi | ae6867d84b | |
Valentino Orlandi | fcfc52f1ba | |
Valentino Orlandi | 0fc4281066 | |
Valentino Orlandi | b418eca43a | |
Valentino Orlandi | abb2662b98 | |
Valentino Orlandi | 56c2ced6e5 | |
Valentino Orlandi | c2b0e89bd6 | |
Valentino Orlandi | 8b656049ce | |
Valentino Orlandi | 969a5f58d0 | |
Valentino Orlandi | fa0ea678d1 | |
Valentino Orlandi | cc0dcadc75 | |
Valentino Orlandi | 5d2b4aa24e |
|
@ -5,7 +5,7 @@
|
|||
### Requirements / Dependencies
|
||||
|
||||
- C++ 20
|
||||
- Qt6 *(Framework 6.2+, Linguist, Widgets, Charts, Sql, Network)*
|
||||
- Qt6 *(Framework 6.6+, Linguist, Widgets, Charts, Sql, Network)*
|
||||
- CMake
|
||||
- gcc / clang / msvc<br/><br/>
|
||||
|
||||
|
@ -16,7 +16,7 @@
|
|||
- Prepare a build folder:
|
||||
<br/>`mkdir build && cd build`<br/><br/>
|
||||
- Prepare **CMake**'s build files:
|
||||
<br/>`cmake ../logdoctor -DCMAKE_BUILD_TYPE=MinSizeRel`<br/><br/>
|
||||
<br/>`cmake ../logdoctor -DCMAKE_BUILD_TYPE=Release`<br/><br/>
|
||||
- Use **CMake** to compile the entire project:
|
||||
<br/>`cmake --build ./ --target all`<br/><br/>
|
||||
|
||||
|
|
|
@ -67,3 +67,8 @@ IisBlacklistClientUsed=true
|
|||
|
||||
[Crapview]
|
||||
CrapviewDialogsLevel=1
|
||||
CrapviewSpeedTimeInterval=1
|
||||
CrapviewSpeedTimeFormat=hh:mm
|
||||
CrapviewCountPieSize=0.6
|
||||
CrapviewCountMaxSlices=15
|
||||
CrapviewRelationalTimeFormat=hh:mm
|
||||
|
|
|
@ -21,6 +21,14 @@ else()
|
|||
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
|
||||
endif()
|
||||
|
||||
if(CMAKE_BUILD_TYPE EQUAL "RELEASE")
|
||||
include(CheckIPOSupported)
|
||||
check_ipo_supported(RESULT supported)
|
||||
if(supported)
|
||||
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
find_package(QT NAMES Qt6 REQUIRED COMPONENTS Core Widgets Charts LinguistTools Sql Network)
|
||||
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Widgets Charts LinguistTools Sql Network)
|
||||
|
||||
|
@ -119,6 +127,8 @@ set(PROJECT_SOURCES
|
|||
modules/warnlists/modules/warnlist_item.h
|
||||
modules/warnlists/modules/warnlist_item.cpp
|
||||
|
||||
modules/crapconf/lib.h
|
||||
|
||||
modules/craplog/lib.h
|
||||
modules/craplog/craplog.h
|
||||
modules/craplog/craplog.cpp
|
||||
|
|
|
@ -33,6 +33,8 @@
|
|||
#include "modules/crapview/lib.h"
|
||||
#include "modules/crapview/modules/filters.h"
|
||||
|
||||
#include "modules/crapconf/lib.h"
|
||||
|
||||
#include "tools/crappath/crappath.h"
|
||||
#include "tools/crapnote/crapnote.h"
|
||||
|
||||
|
@ -221,6 +223,11 @@ MainWindow::MainWindow(QWidget *parent)
|
|||
// charts
|
||||
this->ui->box_ConfCharts_Theme->setCurrentIndex( static_cast<int>(GlobalConfigs::charts_theme) );
|
||||
this->refreshChartsPreview();
|
||||
this->ui->box_ConfCharts_Speed_TimeInterval->setCurrentText( QString::number(this->crapview.getSpeedTimeInterval()) );
|
||||
this->ui->box_ConfCharts_Speed_TimeFormat->setCurrentText( this->crapview.getSpeedTimeFormat() );
|
||||
this->ui->doubleSpinBox_ConfCharts_Count_PieSize->setValue( this->crapview.getCountPieSize() );
|
||||
this->ui->spinBox_ConfCharts_Count_MaxSlices->setValue( this->crapview.getCountMaxSlices() );
|
||||
this->ui->box_ConfCharts_Relat_TimeFormat->setCurrentText( this->crapview.getRelatTimeFormat() );
|
||||
// databases
|
||||
this->ui->inLine_ConfDatabases_Data_Path->setText( QString::fromStdString( this->db_data_path ) );
|
||||
this->ui->button_ConfDatabases_Data_Save->setEnabled( false );
|
||||
|
@ -847,6 +854,56 @@ void MainWindow::readConfigs()
|
|||
invalid_lines.append( QString::fromStdString( line ) );
|
||||
}
|
||||
|
||||
} else if ( var == "CrapviewSpeedTimeInterval" ) {
|
||||
try {
|
||||
const qint64 value{ std::stoll( val ) };
|
||||
if ( const int index{this->ui->box_ConfCharts_Speed_TimeInterval->findText( QString::fromStdString( val ) )}; index >= 0 ) {
|
||||
this->crapview.setSpeedTimeInterval( value );
|
||||
} else {
|
||||
invalid_lines.append( QString::fromStdString( line ) );
|
||||
}
|
||||
} catch ( ... ) { // std::exception
|
||||
invalid_lines.append( QString::fromStdString( line ) );
|
||||
}
|
||||
|
||||
} else if ( var == "CrapviewSpeedTimeFormat" ) {
|
||||
if ( val == "hh:mm" || val == "hh" ) {
|
||||
this->crapview.setSpeedTimeFormat( QString::fromStdString( val ) );
|
||||
} else {
|
||||
invalid_lines.append( QString::fromStdString( line ) );
|
||||
}
|
||||
|
||||
} else if ( var == "CrapviewCountPieSize" ) {
|
||||
try {
|
||||
const qreal value{ std::stod( val ) };
|
||||
if ( value >= 0.6 && value <= 0.8 ) {
|
||||
this->crapview.setCountPieSize( value );
|
||||
} else {
|
||||
invalid_lines.append( QString::fromStdString( line ) );
|
||||
}
|
||||
} catch ( ... ) { // std::exception
|
||||
invalid_lines.append( QString::fromStdString( line ) );
|
||||
}
|
||||
|
||||
} else if ( var == "CrapviewCountMaxSlices" ) {
|
||||
try {
|
||||
const int value{ std::stoi( val ) };
|
||||
if ( value >= 1 && value <= 31 ) {
|
||||
this->crapview.setCountMaxSlices( value );
|
||||
} else {
|
||||
invalid_lines.append( QString::fromStdString( line ) );
|
||||
}
|
||||
} catch ( ... ) { // std::exception
|
||||
invalid_lines.append( QString::fromStdString( line ) );
|
||||
}
|
||||
|
||||
} else if ( var == "CrapviewRelationalTimeFormat" ) {
|
||||
if ( val == "hh:mm" || val == "hh" ) {
|
||||
this->crapview.setRelatTimeFormat( QString::fromStdString( val ) );
|
||||
} else {
|
||||
invalid_lines.append( QString::fromStdString( line ) );
|
||||
}
|
||||
|
||||
}/* else {
|
||||
// not valid
|
||||
}*/
|
||||
|
@ -1063,6 +1120,11 @@ void MainWindow::writeConfigs()
|
|||
//// CRAPVIEW ////
|
||||
configs += "\n\n[Crapview]";
|
||||
configs += "\nCrapviewDialogsLevel=" + toString( this->crapview.getDialogsLevel() );
|
||||
configs += "\nCrapviewSpeedTimeInterval=" + std::to_string( this->crapview.getSpeedTimeInterval() );
|
||||
configs += "\nCrapviewSpeedTimeFormat=" + this->crapview.getSpeedTimeFormat().toStdString();
|
||||
configs += "\nCrapviewCountPieSize=" + std::to_string( this->crapview.getCountPieSize() );
|
||||
configs += "\nCrapviewCountMaxSlices=" + std::to_string( this->crapview.getCountMaxSlices() );
|
||||
configs += "\nCrapviewRelationalTimeFormat=" + this->crapview.getRelatTimeFormat().toStdString();
|
||||
|
||||
// write on file
|
||||
try {
|
||||
|
@ -1439,6 +1501,14 @@ void MainWindow::updateUiIcons()
|
|||
icon_name += "conf_dialogs";
|
||||
} else if ( text == tr("Charts") ) {
|
||||
icon_name += "conf_charts";
|
||||
} else if ( text == tr("Appearance") ) {
|
||||
icon_name += "conf_charts_style";
|
||||
} else if ( text == tr("Speed") ) {
|
||||
icon_name += "conf_speed";
|
||||
} else if ( text == tr("Count") ) {
|
||||
icon_name += "conf_count";
|
||||
} else if ( text == tr("Relational") ) {
|
||||
icon_name += "conf_relational";
|
||||
} else if ( text == tr("TextBrowser") ) {
|
||||
icon_name += "conf_textbrowser";
|
||||
} else if ( text == tr("Databases") ) {
|
||||
|
@ -1559,9 +1629,10 @@ void MainWindow::updateUiFonts()
|
|||
const QFont& small_font{ this->fonts.at( "main_small" ) };
|
||||
const QFont& font{ this->fonts.at( "main" ) };
|
||||
const QFont& big_font{ this->fonts.at( "main_big" ) };
|
||||
QFont menu_font{ this->fonts.at( "main_small" ) };
|
||||
const QFont& tb_font{ this->TB.getFont() };
|
||||
QFont menu_font{ small_font };
|
||||
menu_font.setPointSizeF( this->font_size_small+1.5 );
|
||||
QFont header_font{ this->fonts.at( "main_small" ) };
|
||||
QFont header_font{ small_font };
|
||||
header_font.setPointSizeF( this->font_size_small+2 );
|
||||
// menu
|
||||
this->ui->menuLanguage->setFont( menu_font );
|
||||
|
@ -1588,7 +1659,7 @@ void MainWindow::updateUiFonts()
|
|||
this->ui->listLogFiles->setFont( font );
|
||||
this->ui->listLogFiles->headerItem()->setFont( 0, header_font );
|
||||
this->ui->listLogFiles->headerItem()->setFont( 1, header_font );
|
||||
this->ui->textLogFiles->setFont( this->TB.getFont() );
|
||||
this->ui->textLogFiles->setFont( tb_font );
|
||||
// log files parse
|
||||
this->ui->label_MakeStats_Size->setFont( font );
|
||||
this->ui->label_MakeStats_Lines->setFont( font );
|
||||
|
@ -1750,11 +1821,21 @@ void MainWindow::updateUiFonts()
|
|||
this->ui->label_ConfTextBrowser_ColorScheme->setFont( big_font );
|
||||
this->ui->box_ConfTextBrowser_ColorScheme->setFont( font );
|
||||
this->ui->label_ConfTextBrowser_Preview->setFont( big_font );
|
||||
this->ui->textBrowser_ConfTextBrowser_Preview->setFont( this->TB.getFont() );
|
||||
this->ui->textBrowser_ConfTextBrowser_Preview->setFont( tb_font );
|
||||
// conf charts
|
||||
this->ui->label_ConfCharts_Theme->setFont( big_font );
|
||||
this->ui->box_ConfCharts_Theme->setFont( font );
|
||||
this->ui->label_ConfCharts_Preview->setFont( big_font );
|
||||
this->ui->label_ConfCharts_Speed_TimeInterval->setFont( big_font );
|
||||
this->ui->box_ConfCharts_Speed_TimeInterval->setFont( font );
|
||||
this->ui->label_ConfCharts_Speed_TimeFormat->setFont( big_font );
|
||||
this->ui->box_ConfCharts_Speed_TimeFormat->setFont( font );
|
||||
this->ui->label_ConfCharts_Count_PieSize->setFont( big_font );
|
||||
this->ui->doubleSpinBox_ConfCharts_Count_PieSize->setFont( font );
|
||||
this->ui->label_ConfCharts_Count_MaxSlices->setFont( big_font );
|
||||
this->ui->spinBox_ConfCharts_Count_MaxSlices->setFont( font );
|
||||
this->ui->label_ConfCharts_Relat_TimeFormat->setFont( big_font );
|
||||
this->ui->box_ConfCharts_Relat_TimeFormat->setFont( font );
|
||||
// conf databases
|
||||
this->ui->label_ConfDatabases_Paths->setFont( big_font );
|
||||
this->ui->label_ConfDatabases_Data->setFont( font );
|
||||
|
@ -1781,7 +1862,7 @@ void MainWindow::updateUiFonts()
|
|||
this->ui->label_ConfApache_Format_String->setFont( font );
|
||||
this->ui->inLine_ConfApache_Format_String->setFont( font );
|
||||
this->ui->button_ConfApache_Format_Sample->setFont( font );
|
||||
this->ui->preview_ConfApache_Format_Sample->setFont( this->TB.getFont() );
|
||||
this->ui->preview_ConfApache_Format_Sample->setFont( tb_font );
|
||||
this->ui->box_ConfApache_Warnlist_Field->setFont( font );
|
||||
this->ui->checkBox_ConfApache_Warnlist_Used->setFont( font );
|
||||
this->ui->inLine_ConfApache_Warnlist_String->setFont( font );
|
||||
|
@ -1796,7 +1877,7 @@ void MainWindow::updateUiFonts()
|
|||
this->ui->label_ConfNginx_Format_String->setFont( font );
|
||||
this->ui->inLine_ConfNginx_Format_String->setFont( font );
|
||||
this->ui->button_ConfNginx_Format_Sample->setFont( font );
|
||||
this->ui->preview_ConfNginx_Format_Sample->setFont( this->TB.getFont() );
|
||||
this->ui->preview_ConfNginx_Format_Sample->setFont( tb_font );
|
||||
this->ui->box_ConfNginx_Warnlist_Field->setFont( font );
|
||||
this->ui->checkBox_ConfNginx_Warnlist_Used->setFont( font );
|
||||
this->ui->inLine_ConfNginx_Warnlist_String->setFont( font );
|
||||
|
@ -1811,7 +1892,7 @@ void MainWindow::updateUiFonts()
|
|||
this->ui->label_ConfIis_Format_String->setFont( font );
|
||||
this->ui->inLine_ConfIis_Format_String->setFont( font );
|
||||
this->ui->button_ConfIis_Format_Sample->setFont( font );
|
||||
this->ui->preview_ConfIis_Format_Sample->setFont( this->TB.getFont() );
|
||||
this->ui->preview_ConfIis_Format_Sample->setFont( tb_font );
|
||||
this->ui->box_ConfIis_Warnlist_Field->setFont( font );
|
||||
this->ui->checkBox_ConfIis_Warnlist_Used->setFont( font );
|
||||
this->ui->inLine_ConfIis_Warnlist_String->setFont( font );
|
||||
|
@ -4429,58 +4510,66 @@ void MainWindow::on_tree_ConfSections_itemClicked(QTreeWidgetItem *item, int col
|
|||
if ( section == tr("General") ) {
|
||||
return;
|
||||
} else if ( section == tr("Window") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(0);
|
||||
this->setConfigsPage( General_Window );
|
||||
} else if ( section == tr("Dialogs") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(1);
|
||||
this->setConfigsPage( General_Dialogs );
|
||||
} else if ( section == tr("Charts") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(2);
|
||||
return;
|
||||
} else if ( section == tr("Appearance") ) {
|
||||
this->setConfigsPage( General_Charts_Appearance );
|
||||
} else if ( section == tr("Speed") ) {
|
||||
this->setConfigsPage( General_Charts_Speed );
|
||||
} else if ( section == tr("Count") ) {
|
||||
this->setConfigsPage( General_Charts_Count );
|
||||
} else if ( section == tr("Relational") ) {
|
||||
this->setConfigsPage( General_Charts_Relational );
|
||||
} else if ( section == tr("TextBrowser") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(3);
|
||||
this->setConfigsPage( General_TextBrowser );
|
||||
} else if ( section == tr("Databases") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(4);
|
||||
this->setConfigsPage( General_Databases );
|
||||
} else if ( section == tr("Logs") ) {
|
||||
return;
|
||||
} else if ( section == tr("Defaults") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(5);
|
||||
this->setConfigsPage( Logs_Defaults );
|
||||
} else if ( section == tr("Control") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(6);
|
||||
this->setConfigsPage( Logs_Control );
|
||||
} else if ( section == tr("Apache2") || section == tr("Nginx") || section == tr("IIS") ) {
|
||||
return;
|
||||
} else if ( section == tr("Path") ) {
|
||||
const QString parent{ item->parent()->text(0) };
|
||||
if ( parent == tr("Apache2") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(7);
|
||||
this->setConfigsPage( Logs_Apache2_Path );
|
||||
} else if ( parent == tr("Nginx") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(11);
|
||||
this->setConfigsPage( Logs_Nginx_Path );
|
||||
} else if ( parent == tr("IIS") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(15);
|
||||
this->setConfigsPage( Logs_IIS_Path );
|
||||
}
|
||||
} else if ( section == tr("Format") ) {
|
||||
const QString parent{ item->parent()->text(0) };
|
||||
if ( parent == tr("Apache2") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(8);
|
||||
this->setConfigsPage( Logs_Apache2_Format );
|
||||
} else if ( parent == tr("Nginx") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(12);
|
||||
this->setConfigsPage( Logs_Nginx_Format );
|
||||
} else if ( parent == tr("IIS") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(16);
|
||||
this->setConfigsPage( Logs_IIS_Format );
|
||||
}
|
||||
} else if ( section == tr("Warnlists") ) {
|
||||
const QString parent{ item->parent()->text(0) };
|
||||
if ( parent == tr("Apache2") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(9);
|
||||
this->setConfigsPage( Logs_Apache2_Warnlists );
|
||||
} else if ( parent == tr("Nginx") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(13);
|
||||
this->setConfigsPage( Logs_Nginx_Warnlists );
|
||||
} else if ( parent == tr("IIS") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(17);
|
||||
this->setConfigsPage( Logs_IIS_Warnlists );
|
||||
}
|
||||
} else if ( section == tr("Blacklists") ) {
|
||||
const QString parent{ item->parent()->text(0) };
|
||||
if ( parent == tr("Apache2") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(10);
|
||||
this->setConfigsPage( Logs_Apache2_Blacklists );
|
||||
} else if ( parent == tr("Nginx") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(14);
|
||||
this->setConfigsPage( Logs_Nginx_Blacklists );
|
||||
} else if ( parent == tr("IIS") ) {
|
||||
this->ui->stackedPages_Conf->setCurrentIndex(18);
|
||||
this->setConfigsPage( Logs_IIS_Blacklists );
|
||||
}
|
||||
} else {
|
||||
throw("Unexpected Conf section: "+section.toStdString());
|
||||
|
@ -4492,6 +4581,11 @@ void MainWindow::on_tree_ConfSections_itemDoubleClicked(QTreeWidgetItem *item, i
|
|||
this->on_tree_ConfSections_itemClicked( item, column );
|
||||
}
|
||||
|
||||
void MainWindow::setConfigsPage( const ConfigsPage page )
|
||||
{
|
||||
this->ui->stackedPages_Conf->setCurrentIndex( page );
|
||||
}
|
||||
|
||||
/////////////////
|
||||
//// GENERAL ////
|
||||
/////////////////
|
||||
|
@ -4711,6 +4805,31 @@ void MainWindow::refreshChartsPreview()
|
|||
this->ui->chart_ConfCharts_Preview );
|
||||
}
|
||||
|
||||
void MainWindow::on_box_ConfCharts_Speed_TimeInterval_currentTextChanged(const QString& arg1)
|
||||
{
|
||||
this->crapview.setSpeedTimeInterval( arg1.toLong() );
|
||||
}
|
||||
|
||||
void MainWindow::on_box_ConfCharts_Speed_TimeFormat_currentTextChanged(const QString& arg1)
|
||||
{
|
||||
this->crapview.setSpeedTimeFormat( arg1 );
|
||||
}
|
||||
|
||||
void MainWindow::on_doubleSpinBox_ConfCharts_Count_PieSize_valueChanged(double arg1)
|
||||
{
|
||||
this->crapview.setCountPieSize( arg1 );
|
||||
}
|
||||
|
||||
void MainWindow::on_spinBox_ConfCharts_Count_MaxSlices_valueChanged(int arg1)
|
||||
{
|
||||
this->crapview.setCountMaxSlices( arg1 );
|
||||
}
|
||||
|
||||
void MainWindow::on_box_ConfCharts_Relat_TimeFormat_currentTextChanged(const QString& arg1)
|
||||
{
|
||||
this->crapview.setRelatTimeFormat( arg1 );
|
||||
}
|
||||
|
||||
|
||||
///////////////////
|
||||
//// DATABASES ////
|
||||
|
|
|
@ -35,6 +35,8 @@ class QTreeWidgetItem;
|
|||
enum class LogField;
|
||||
enum class ColorsScheme : unsigned char;
|
||||
|
||||
enum ConfigsPage : unsigned char;
|
||||
|
||||
|
||||
namespace Ui {
|
||||
class MainWindow;
|
||||
|
@ -65,6 +67,7 @@ private slots:
|
|||
|
||||
///////////////////
|
||||
//// OVERRIDES ////
|
||||
|
||||
void closeEvent( QCloseEvent* event ) override;
|
||||
|
||||
|
||||
|
@ -274,8 +277,8 @@ private slots:
|
|||
void on_button_StatsGlob_Iis_clicked();
|
||||
|
||||
|
||||
/////////////////
|
||||
//// CRAPSET ////
|
||||
//////////////////
|
||||
//// CRAPCONF ////
|
||||
|
||||
void on_tree_ConfSections_itemClicked(QTreeWidgetItem *item, int column);
|
||||
|
||||
|
@ -309,6 +312,16 @@ private slots:
|
|||
|
||||
void on_box_ConfCharts_Theme_currentIndexChanged(int index);
|
||||
|
||||
void on_box_ConfCharts_Speed_TimeInterval_currentTextChanged(const QString& arg1);
|
||||
|
||||
void on_box_ConfCharts_Speed_TimeFormat_currentTextChanged(const QString& arg1);
|
||||
|
||||
void on_doubleSpinBox_ConfCharts_Count_PieSize_valueChanged(double arg1);
|
||||
|
||||
void on_spinBox_ConfCharts_Count_MaxSlices_valueChanged(int arg1);
|
||||
|
||||
void on_box_ConfCharts_Relat_TimeFormat_currentTextChanged(const QString& arg1);
|
||||
|
||||
//// DATABASES ////
|
||||
|
||||
void on_tool_ConfDatabases_Data_Dialog_clicked();
|
||||
|
@ -896,9 +909,11 @@ private:
|
|||
void resetStatsGlob();
|
||||
|
||||
|
||||
/////////////////
|
||||
//// CRAPSET ////
|
||||
/////////////////
|
||||
//////////////////
|
||||
//// CRAPCONF ////
|
||||
//////////////////
|
||||
|
||||
void setConfigsPage( const ConfigsPage page );
|
||||
|
||||
void refreshTextBrowserPreview();
|
||||
|
||||
|
|
|
@ -2727,7 +2727,7 @@ Use '!', '=','<' or '>' to declare what to use</string>
|
|||
<widget class="QWidget" name="scrollAreaContent_StatsCount">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<x>14</x>
|
||||
<y>0</y>
|
||||
<width>263</width>
|
||||
<height>402</height>
|
||||
|
@ -6008,6 +6008,26 @@ With numbers, use '!', '=','<' or '>' to declare what to use</string>
|
|||
<property name="text">
|
||||
<string>Charts</string>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Appearance</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Speed</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Count</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Relational</string>
|
||||
</property>
|
||||
</item>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
|
@ -6826,7 +6846,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use</string>
|
|||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="page_Conf_General_Charts">
|
||||
<widget class="QWidget" name="page_Conf_General_Charts_Theme">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_7">
|
||||
<item>
|
||||
<widget class="QFrame" name="frame_ConfCharts_Theme">
|
||||
|
@ -6947,7 +6967,7 @@ With numbers, use '!', '=','<' or '>' to declare what to use</string>
|
|||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="frame_ConfCharts_Preview">
|
||||
<widget class="QFrame" name="frame_ConfCharts_Theme_Preview">
|
||||
<layout class="QGridLayout" name="gridLayout_83">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_ConfCharts_Preview">
|
||||
|
@ -6981,6 +7001,9 @@ With numbers, use '!', '=','<' or '>' to declare what to use</string>
|
|||
<height>256</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="acceptDrops">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
|
@ -6988,6 +7011,597 @@ With numbers, use '!', '=','<' or '>' to declare what to use</string>
|
|||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="page_Conf_General_Charts_Speed">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_31">
|
||||
<item>
|
||||
<widget class="QFrame" name="frame_ConfCharts_Speed_TimeInterval">
|
||||
<layout class="QGridLayout" name="gridLayout_89">
|
||||
<item row="1" column="0">
|
||||
<spacer name="spacer_ConfCharts_Speed_1">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<spacer name="spacer_ConfCharts_Speed_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>569</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="3">
|
||||
<widget class="QLabel" name="label_ConfCharts_Speed_TimeInterval">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>128</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>16</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Represents a step in the time axis, in seconds.
|
||||
All the values falling inside the same interval will be merged and the mean value will be used.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Time interval</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QComboBox" name="box_ConfCharts_Speed_TimeInterval">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>72</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>1</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>2</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>3</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>4</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>5</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>10</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>15</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>20</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>30</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>60</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>120</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>180</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>240</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>300</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>600</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>900</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>1200</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>1800</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>3600</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="frame_ConfCharts_Speed_TimeFormat">
|
||||
<layout class="QGridLayout" name="gridLayout_90">
|
||||
<item row="1" column="2">
|
||||
<spacer name="spacer_ConfCharts_Speed_4">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>569</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="3">
|
||||
<widget class="QLabel" name="label_ConfCharts_Speed_TimeFormat">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>128</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>16</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>The format to use for the labels of the time axis.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Time format</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<spacer name="spacer_ConfCharts_Speed_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QComboBox" name="box_ConfCharts_Speed_TimeFormat">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>96</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>hh:mm</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>hh</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="spacer_ConfCharts_Speed">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>608</width>
|
||||
<height>333</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="page_Conf_General_Charts_Count">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_30">
|
||||
<item>
|
||||
<widget class="QFrame" name="frame_ConfCharts_Count_PieSize">
|
||||
<layout class="QGridLayout" name="gridLayout_86">
|
||||
<item row="1" column="0">
|
||||
<spacer name="spacer_ConfCharts_Count_1">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<spacer name="spacer_ConfCharts_Count_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>569</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="3">
|
||||
<widget class="QLabel" name="label_ConfCharts_Count_PieSize">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>128</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>16</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>The size of the pie</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Pie size</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_ConfCharts_Count_PieSize">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>64</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::PlusMinus</enum>
|
||||
</property>
|
||||
<property name="correctionMode">
|
||||
<enum>QAbstractSpinBox::CorrectToNearestValue</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>0.400000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>0.800000000000000</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.010000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>0.600000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="frame_ConfCharts_Count_MaxSlices">
|
||||
<layout class="QGridLayout" name="gridLayout_87">
|
||||
<item row="1" column="0">
|
||||
<spacer name="spacer_ConfCharts_Count_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<spacer name="spacer_ConfCharts_Count_4">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>569</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="3">
|
||||
<widget class="QLabel" name="label_ConfCharts_Count_MaxSlices">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>128</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>16</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>The maximum number of slices that the pie will be composed of.
|
||||
Exceeding slices will be grouped into one comprehensive slice.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Maximum slices</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QSpinBox" name="spinBox_ConfCharts_Count_MaxSlices">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>56</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::PlusMinus</enum>
|
||||
</property>
|
||||
<property name="correctionMode">
|
||||
<enum>QAbstractSpinBox::CorrectToNearestValue</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>31</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>15</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="spacer_ConfCharts_Count">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="page_Conf_General_Charts_Relat">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_32">
|
||||
<item>
|
||||
<widget class="QFrame" name="frame_ConfCharts_Relat_TimeFormat">
|
||||
<layout class="QGridLayout" name="gridLayout_91">
|
||||
<item row="1" column="2">
|
||||
<spacer name="spacer_ConfCharts_Relat_1">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>569</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="3">
|
||||
<widget class="QLabel" name="label_ConfCharts_Relat_TimeFormat">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>128</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>16</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>The format to use for the labels of the time axis.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Time format</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QComboBox" name="box_ConfCharts_Relat_TimeFormat">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>96</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>hh:mm</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>hh</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<spacer name="spacer_ConfCharts_Relat_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="spacer_ConfCharts_Relat">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>608</width>
|
||||
<height>427</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="page_Conf_General_TextBrowser">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_11">
|
||||
<item>
|
||||
|
@ -8582,7 +9196,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED'</string>
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>98</width>
|
||||
<width>62</width>
|
||||
<height>54</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
@ -9456,7 +10070,7 @@ Fields marked as 'DISCARDED' got parsed correctly, but are not considered by Log
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>98</width>
|
||||
<width>62</width>
|
||||
<height>54</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
@ -10654,7 +11268,7 @@ Any field not considered by LogDoctor will appear as 'DISCARDED'</string>
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>98</width>
|
||||
<width>62</width>
|
||||
<height>54</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
#ifndef LOGDOCTOR__CRAPCONF__LIB_H
|
||||
#define LOGDOCTOR__CRAPCONF__LIB_H
|
||||
|
||||
|
||||
enum ConfigsPage : unsigned char {
|
||||
General_Window = 0,
|
||||
General_Dialogs = 1,
|
||||
General_Charts_Appearance = 2,
|
||||
General_Charts_Speed = 3,
|
||||
General_Charts_Count = 4,
|
||||
General_Charts_Relational = 5,
|
||||
General_TextBrowser = 6,
|
||||
General_Databases = 7,
|
||||
Logs_Defaults = 8,
|
||||
Logs_Control = 9,
|
||||
Logs_Apache2_Path = 10,
|
||||
Logs_Apache2_Format = 11,
|
||||
Logs_Apache2_Warnlists = 12,
|
||||
Logs_Apache2_Blacklists = 13,
|
||||
Logs_Nginx_Path = 14,
|
||||
Logs_Nginx_Format = 15,
|
||||
Logs_Nginx_Warnlists = 16,
|
||||
Logs_Nginx_Blacklists = 17,
|
||||
Logs_IIS_Path = 18,
|
||||
Logs_IIS_Format = 19,
|
||||
Logs_IIS_Warnlists = 20,
|
||||
Logs_IIS_Blacklists = 21,
|
||||
};
|
||||
|
||||
|
||||
#endif // LOGDOCTOR__CRAPCONF__LIB_H
|
|
@ -198,17 +198,17 @@ QString Craplog::getLogsFormatSample( const WebServer& web_server ) const
|
|||
bool Craplog::checkCurrentLogsFormat() const noexcept
|
||||
{
|
||||
if ( this->current_log_format.string.empty() ) {
|
||||
// format string not set
|
||||
DialogSec::errLogFormatNotSet( nullptr );
|
||||
return false;
|
||||
// format string not set
|
||||
DialogSec::errLogFormatNotSet( nullptr );
|
||||
return false;
|
||||
} else if ( this->current_log_format.fields.empty() ) {
|
||||
// no field, useless to parse
|
||||
DialogSec::errLogFormatNoFields( nullptr );
|
||||
return false;
|
||||
// no field, useless to parse
|
||||
DialogSec::errLogFormatNoFields( nullptr );
|
||||
return false;
|
||||
} else if ( this->current_log_format.separators.size() < this->current_log_format.fields.size()-1 ) {
|
||||
// at least one separator is missing between two (or more) fields
|
||||
DialogSec::errLogFormatNoSeparators( nullptr );
|
||||
return false;
|
||||
// at least one separator is missing between two (or more) fields
|
||||
DialogSec::errLogFormatNoSeparators( nullptr );
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -270,7 +270,7 @@ const std::vector<LogFile>& Craplog::getLogsList() const noexcept
|
|||
const LogFile& Craplog::getLogFileItem( const QString& file_name ) const
|
||||
{
|
||||
const auto item{ std::find_if( this->logs_list.begin(), this->logs_list.end(),
|
||||
[&file_name](const LogFile& file){ return file.name()==file_name; } ) };
|
||||
[&file_name](const LogFile& file){ return file.name()==file_name; } ) };
|
||||
if ( item != this->logs_list.end() ) return *item;
|
||||
// should be unreachable
|
||||
throw GenericException("File item not found");
|
||||
|
@ -281,7 +281,7 @@ const LogFile& Craplog::getLogFileItem( const QString& file_name ) const
|
|||
bool Craplog::setLogFileSelected( const QString& file_name ) noexcept
|
||||
{
|
||||
const auto item{ std::find_if( this->logs_list.begin(), this->logs_list.end(),
|
||||
[&file_name](const LogFile& file){ return file.name() == file_name; } ) };
|
||||
[&file_name](const LogFile& file){ return file.name() == file_name; } ) };
|
||||
if ( item != this->logs_list.end() ) {
|
||||
item->setSelected();
|
||||
return true;
|
||||
|
@ -293,8 +293,7 @@ void Craplog::clearLogFilesSelection() noexcept
|
|||
{
|
||||
std::ignore = std::for_each(
|
||||
this->logs_list.begin(), this->logs_list.end(),
|
||||
[]( LogFile& it )
|
||||
{ if (it.isSelected()) it.setUnselected(); } );
|
||||
[](LogFile& it){ if (it.isSelected()) it.setUnselected(); } );
|
||||
}
|
||||
|
||||
|
||||
|
@ -309,7 +308,7 @@ void Craplog::scanLogsDir()
|
|||
this->logs_paths.at( this->current_web_server ),
|
||||
this->logs_formats.at( this->current_web_server ),
|
||||
this->hashOps,
|
||||
[this]( const std::string& file_name)
|
||||
[this]( const std::string& file_name )
|
||||
{ return this->isFileNameValid( file_name ); }
|
||||
) };
|
||||
QThread* worker_thread{ new QThread() };
|
||||
|
@ -507,7 +506,7 @@ bool Craplog::checkStuff()
|
|||
// appears twice in the list
|
||||
QString msg{ file.name() };
|
||||
if ( this->dialogs_level == DL_EXPLANATORY ) {
|
||||
msg += "\n" + QString::fromStdString( file.hash() );
|
||||
msg += "\n" + QString::fromStdString( file.hash() );
|
||||
}
|
||||
const int choice = DialogSec::choiceDuplicateFile( msg );
|
||||
if ( choice == 0 ) {
|
||||
|
@ -720,9 +719,6 @@ void Craplog::hireWorker( const Blacklists& blacklists ) const
|
|||
void Craplog::stopWorking( const bool successful )
|
||||
{
|
||||
this->db_edited = successful;
|
||||
if ( successful ) {
|
||||
// insert the hashes of the used files
|
||||
}
|
||||
emit this->finishedWorking();
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
#include "logs.h"
|
||||
|
||||
#include "modules/exceptions.h"
|
||||
#include "modules/craplog/modules/datetime.h"
|
||||
|
||||
#include "utilities/strings.h"
|
||||
|
||||
|
|
|
@ -61,7 +61,6 @@ void Crapview::refreshDates()
|
|||
}
|
||||
|
||||
if ( result ) {
|
||||
// std::unordered_map<int, std::unordered_map<int, std::unordered_map<int, std::vector<int>>>>
|
||||
// { web_server_id : { year : { month : [ days ] } } }
|
||||
this->dates = std::move( *result );
|
||||
}
|
||||
|
@ -75,7 +74,7 @@ QStringList Crapview::getYears( const QString& web_server ) const noexcept
|
|||
{
|
||||
QStringList years;
|
||||
if ( ! this->dates.empty() ) {
|
||||
const int ws{ this->WebServer_s2i.value( web_server ) };
|
||||
const WebServer ws{ this->WebServer_s2e.value( web_server ) };
|
||||
if ( const auto& y{ this->dates.at( ws ) }; !y.empty() ) {
|
||||
std::transform( y.cbegin(), y.cend(),
|
||||
std::back_inserter( years ),
|
||||
|
@ -88,10 +87,10 @@ QStringList Crapview::getMonths( const QString& web_server, const QString& year
|
|||
{
|
||||
QStringList months;
|
||||
if ( ! this->dates.empty() ) {
|
||||
const int ws{ this->WebServer_s2i.value( web_server ) };
|
||||
const WebServer ws{ this->WebServer_s2e.value( web_server ) };
|
||||
if ( const auto& y{ this->dates.at( ws ) }; !y.empty() ) {
|
||||
const int year_{ year.toInt() };
|
||||
if ( const auto& m{ this->dates.at( ws ).at( year_ ) }; !m.empty() ) {
|
||||
if ( const auto& m{ y.at( year_ ) }; !m.empty() ) {
|
||||
const auto& m_tr{ this->dbQuery.MONTHS };
|
||||
std::transform( m.cbegin(), m.cend(),
|
||||
std::back_inserter( months ),
|
||||
|
@ -105,10 +104,10 @@ QStringList Crapview::getDays( const QString& web_server, const QString& year, c
|
|||
{
|
||||
QStringList days;
|
||||
if ( ! this->dates.empty() ) {
|
||||
const int ws{ this->WebServer_s2i.value( web_server ) };
|
||||
const WebServer ws{ this->WebServer_s2e.value( web_server ) };
|
||||
if ( const auto& y{ this->dates.at( ws ) }; !y.empty() ) {
|
||||
const int year_{ year.toInt() };
|
||||
if ( const auto& m{ this->dates.at( ws ).at( year_ ) }; !m.empty() ) {
|
||||
if ( const auto& m{ y.at( year_ ) }; !m.empty() ) {
|
||||
const int month_{ this->getMonthNumber( month ) };
|
||||
if ( const auto& d{ m.at( month_ ) }; !d.empty() ) {
|
||||
std::transform( d.cbegin(), d.cend(),
|
||||
|
@ -160,6 +159,51 @@ QStringList Crapview::getSpeedHeaderColumns() const noexcept
|
|||
};
|
||||
}
|
||||
|
||||
void Crapview::setSpeedTimeInterval( const qint64 interval ) noexcept
|
||||
{
|
||||
this->speed_interval = interval;
|
||||
}
|
||||
qint64 Crapview::getSpeedTimeInterval() const noexcept
|
||||
{
|
||||
return this->speed_interval;
|
||||
}
|
||||
|
||||
void Crapview::setSpeedTimeFormat( const QString& format ) noexcept
|
||||
{
|
||||
this->speed_time_format = format;
|
||||
}
|
||||
const QString& Crapview::getSpeedTimeFormat() const noexcept
|
||||
{
|
||||
return this->speed_time_format;
|
||||
}
|
||||
|
||||
void Crapview::setCountPieSize( const qreal size ) noexcept
|
||||
{
|
||||
this->count_pie_size = size;
|
||||
}
|
||||
qreal Crapview::getCountPieSize() const noexcept
|
||||
{
|
||||
return this->count_pie_size;
|
||||
}
|
||||
|
||||
void Crapview::setCountMaxSlices( const int value ) noexcept
|
||||
{
|
||||
this->count_max_slices = value;
|
||||
}
|
||||
int Crapview::getCountMaxSlices() const noexcept
|
||||
{
|
||||
return this->count_max_slices;
|
||||
}
|
||||
|
||||
void Crapview::setRelatTimeFormat( const QString& format ) noexcept
|
||||
{
|
||||
this->relat_time_format = format;
|
||||
}
|
||||
const QString& Crapview::getRelatTimeFormat() const noexcept
|
||||
{
|
||||
return this->relat_time_format;
|
||||
}
|
||||
|
||||
|
||||
////////////////
|
||||
//// CHARTS ////
|
||||
|
@ -193,7 +237,6 @@ void Crapview::drawWarn( QTableWidget* table, QChartView* chart, const QChart::C
|
|||
return;
|
||||
}
|
||||
|
||||
// std::vector<std::vector<std::vector<std::array<QString,18>>>>
|
||||
// day -> [ hours[ 10th_minutes[ lines[ log_data ] ] ] ]
|
||||
// hour -> [ 10th_minutes[ minute[ lines[ log_data ] ] ] ]
|
||||
const auto items{ std::move(*result) };
|
||||
|
@ -214,29 +257,26 @@ void Crapview::drawWarn( QTableWidget* table, QChartView* chart, const QChart::C
|
|||
const auto target{ line.at( 8ul ).toStdString() };
|
||||
const auto& list{ warnlist.uri.list };
|
||||
if ( std::any_of( list.cbegin(), list.cend(), [&target](std::string_view flag){ return StringOps::startsWith( target, flag ); } ) ) {
|
||||
// match found! skip this line
|
||||
is_warning |= true;
|
||||
warning_cols.emplace_back( 5 );
|
||||
}
|
||||
}
|
||||
if ( warnlist.client.used ) {
|
||||
const auto target{ line.at( 12ul ).toStdString() };
|
||||
const auto& list{ warnlist.client.list };
|
||||
if ( std::any_of( list.cbegin(), list.cend(), [&target](std::string_view flag){ return StringOps::startsWith( target, flag ); } ) ) {
|
||||
// match found! skip this line
|
||||
is_warning |= true;
|
||||
warning_cols.emplace_back( 9 );
|
||||
}
|
||||
}
|
||||
if ( warnlist.user_agent.used ) {
|
||||
const auto target{ line.at( 11ul ).toStdString() };
|
||||
const auto& list{ warnlist.user_agent.list };
|
||||
if ( std::any_of( list.cbegin(), list.cend(), [&target](std::string_view flag){ return StringOps::startsWith( target, flag ); } ) ) {
|
||||
// match found! skip this line
|
||||
is_warning |= true;
|
||||
warning_cols.emplace_back( 8 );
|
||||
}
|
||||
}
|
||||
if ( warnlist.client.used ) {
|
||||
const auto target{ line.at( 12ul ).toStdString() };
|
||||
const auto& list{ warnlist.client.list };
|
||||
if ( std::any_of( list.cbegin(), list.cend(), [&target](std::string_view flag){ return StringOps::startsWith( target, flag ); } ) ) {
|
||||
is_warning |= true;
|
||||
warning_cols.emplace_back( 9 );
|
||||
}
|
||||
}
|
||||
return std::make_tuple( is_warning, warning_cols );
|
||||
}
|
||||
};
|
||||
|
@ -272,7 +312,6 @@ void Crapview::drawWarn( QTableWidget* table, QChartView* chart, const QChart::C
|
|||
}
|
||||
};
|
||||
|
||||
// bars
|
||||
std::vector<std::vector<QBarSet*>> sets;
|
||||
|
||||
// build the bars and the table upon data
|
||||
|
@ -332,28 +371,25 @@ void Crapview::drawWarn( QTableWidget* table, QChartView* chart, const QChart::C
|
|||
table->verticalHeader()->setVisible( false );
|
||||
|
||||
// apply the colors and append to the series
|
||||
QColor cols[]{ QColor(127,127,127), QColor(237,80,61) };
|
||||
const QColor cols[]{ QColor(127,127,127), QColor(237,80,61) };
|
||||
std::vector<QStackedBarSeries*> b_series;
|
||||
const size_t max{ sets.size() };
|
||||
for ( size_t i{0}; i<max; ++i ) {
|
||||
const auto& set{ sets.at( i ) };
|
||||
b_series.push_back( new QStackedBarSeries() );
|
||||
auto* series{ new QStackedBarSeries() };
|
||||
for ( size_t w{0}; w<2ul; ++w ) {
|
||||
QBarSet* b = set.at( w );
|
||||
QBarSet* b{ set.at( w ) };
|
||||
b->setColor( cols[ w ] );
|
||||
b_series.at( i )->append( b );
|
||||
series->append( b );
|
||||
}
|
||||
}
|
||||
for ( auto *s : b_series ) {
|
||||
s->setBarWidth( 1 );
|
||||
series->setBarWidth( 1 );
|
||||
b_series.push_back( series );
|
||||
}
|
||||
|
||||
// set-up the bars chart
|
||||
QChart* b_chart{ new QChart() };
|
||||
// apply the theme
|
||||
b_chart->setTheme( theme );
|
||||
// append the bars
|
||||
foreach ( auto& bars, b_series ) {
|
||||
for ( auto* bars : b_series ) {
|
||||
b_chart->addSeries( bars );
|
||||
}
|
||||
b_chart->setTitle( TR::tr( "Log Lines Marked as Warning" ) );
|
||||
|
@ -388,7 +424,6 @@ void Crapview::drawWarn( QTableWidget* table, QChartView* chart, const QChart::C
|
|||
s->attachAxis( axisY );
|
||||
}
|
||||
|
||||
// apply the chart to the view
|
||||
chart->setChart( b_chart );
|
||||
chart->setRenderHint( QPainter::Antialiasing );
|
||||
}
|
||||
|
@ -401,7 +436,7 @@ void Crapview::drawSpeed( QTableWidget* table, QChartView* chart, const QChart::
|
|||
|
||||
try {
|
||||
|
||||
this->dbQuery.getSpeedData( result, web_server, year, month, day, protocol, method, uri, query, response );
|
||||
this->dbQuery.getSpeedData( result, web_server, year, month, day, protocol, method, uri, query, response, this->speed_interval );
|
||||
|
||||
} catch ( const DatabaseException& e ) {
|
||||
DialogSec::errProcessingStatsData( e.what() );
|
||||
|
@ -414,60 +449,76 @@ void Crapview::drawSpeed( QTableWidget* table, QChartView* chart, const QChart::
|
|||
|
||||
if ( ! result ) {
|
||||
DialogSec::msgNoDataForStats();
|
||||
chart->setChart( new QChart() );
|
||||
return;
|
||||
}
|
||||
|
||||
// std::vector<std::tuple<long long, std::vector<QString>>>
|
||||
// [ ( epoch_msec, [ log_data ] ) ]
|
||||
const auto items{ std::move(*result) };
|
||||
|
||||
// draw the speed chart
|
||||
QLineSeries* line{ new QLineSeries() };
|
||||
|
||||
// build the line upon data
|
||||
size_t i{ 0 };
|
||||
const size_t max_i{ items.size() };
|
||||
int value{0}, count{1}, aux_value, max_value{0}, n_rows{0};
|
||||
bool first_count{ true };
|
||||
qint64 time{ std::get<0>(items.at(0ul)) };
|
||||
QDateTime dt;
|
||||
for ( const auto& item : items ) {
|
||||
++i;
|
||||
// append a value to the chart
|
||||
const qint64 aux_time{ std::get<0>(item) };
|
||||
const std::array<QString,6>& data{ std::get<1>(item) };
|
||||
aux_value = data.at( 0ul ).toInt();
|
||||
// append only if the second is different, else sum
|
||||
if ( aux_time > time ) {
|
||||
value = value/count;
|
||||
int value{0}, count{0}, aux_value, max_value{0}, n_rows{0};
|
||||
qint64 time{ -1 };
|
||||
const auto finalize_value{
|
||||
[&value,&count]()
|
||||
{
|
||||
if ( value == -1 ) {
|
||||
value = 0;
|
||||
} else {
|
||||
value /= count+1;
|
||||
}
|
||||
}
|
||||
};
|
||||
const auto push_to_line{
|
||||
[&max_value]( QLineSeries*const line, const qint64 time, const int value )
|
||||
{
|
||||
line->append( time, value );
|
||||
if ( value > max_value ) {
|
||||
max_value = value;
|
||||
}
|
||||
time = aux_time;
|
||||
value = aux_value;
|
||||
count = 1;
|
||||
first_count |= true;
|
||||
if ( i == max_i ) {
|
||||
// final
|
||||
line->append( time, value );
|
||||
if ( value > max_value ) {
|
||||
max_value = value;
|
||||
}
|
||||
}
|
||||
};
|
||||
const auto set_values{
|
||||
[&time,&value,&count]( const qint64 t, const int v, const int c )
|
||||
{
|
||||
time = t; value = v; count = c;
|
||||
}
|
||||
};
|
||||
for ( const auto& item : items ) {
|
||||
++i;
|
||||
const qint64 aux_time{ std::get<0>(item) };
|
||||
const std::array<QString,6>& data{ std::get<1>(item) };
|
||||
if ( const auto tt{data.at(0ul)}; tt.isEmpty() ) {
|
||||
if ( time != -1 ) {
|
||||
finalize_value();
|
||||
push_to_line( line, time, value );
|
||||
}
|
||||
set_values( aux_time, -1, 0 );
|
||||
push_to_line( line, time, 0 );
|
||||
continue;
|
||||
} else {
|
||||
if ( first_count ) {
|
||||
first_count &= false;
|
||||
aux_value = tt.toInt();
|
||||
if ( aux_time > time ) {
|
||||
finalize_value();
|
||||
push_to_line( line, time, value );
|
||||
set_values( aux_time, aux_value, 0 );
|
||||
if ( i == max_i ) {
|
||||
push_to_line( line, time, value );
|
||||
}
|
||||
} else {
|
||||
++ count;
|
||||
}
|
||||
value += aux_value;
|
||||
if ( i == max_i ) {
|
||||
// final
|
||||
value = value/count;
|
||||
line->append( aux_time, value );
|
||||
if ( value > max_value ) {
|
||||
max_value = value;
|
||||
if ( value == -1 ) {
|
||||
value = 0;
|
||||
} else {
|
||||
++ count;
|
||||
}
|
||||
value += aux_value;
|
||||
if ( i == max_i ) {
|
||||
value /= count+1;
|
||||
push_to_line( line, aux_time, value );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -482,16 +533,13 @@ void Crapview::drawSpeed( QTableWidget* table, QChartView* chart, const QChart::
|
|||
table->setItem( n_rows, 3, new QTableWidgetItem( data.at(3ul) ));
|
||||
table->setItem( n_rows, 4, new QTableWidgetItem( data.at(4ul) ));
|
||||
table->setItem( n_rows, 5, new QTableWidgetItem( data.at(5ul) ));
|
||||
dt = QDateTime::fromMSecsSinceEpoch( aux_time );
|
||||
QDateTime dt{ QDateTime::fromMSecsSinceEpoch( aux_time ) };
|
||||
table->setItem( n_rows, 6, new QTableWidgetItem( dt.time().toString("hh:mm:ss") ));
|
||||
++ n_rows;
|
||||
}
|
||||
}
|
||||
table->verticalHeader()->setVisible( false );
|
||||
|
||||
// fictitious line
|
||||
QLineSeries* line_{ new QLineSeries() };
|
||||
|
||||
// color the area
|
||||
QColor col1{ Qt::GlobalColor::red },
|
||||
col2{ Qt::GlobalColor::green },
|
||||
|
@ -508,23 +556,17 @@ void Crapview::drawSpeed( QTableWidget* table, QChartView* chart, const QChart::
|
|||
pen.setWidth( 1 );
|
||||
line->setPen(pen);
|
||||
|
||||
pen = line_->pen();
|
||||
pen.setBrush( gradient );
|
||||
pen.setWidth( 1 );
|
||||
line_->setPen(pen);
|
||||
|
||||
// build the chart
|
||||
QChart* l_chart{ new QChart() };
|
||||
l_chart->setTheme( theme );
|
||||
l_chart->addSeries( line );
|
||||
l_chart->addSeries( line_ );
|
||||
l_chart->setTitle( TR::tr( "Time Taken to Serve Requests" ) );
|
||||
/*l_chart->legend()->setAlignment( Qt::AlignBottom );*/
|
||||
l_chart->legend()->setVisible( false );
|
||||
|
||||
// set-up the date-time axis (X)
|
||||
QDateTimeAxis* axisX{ new QDateTimeAxis() };
|
||||
axisX->setFormat( "hh:mm" );
|
||||
axisX->setFormat( this->speed_time_format );
|
||||
axisX->setTickCount( 25 );
|
||||
axisX->setTitleText( PrintSec::printableDate( year, this->getMonthNumber(month), day ) );
|
||||
l_chart->addAxis( axisX, Qt::AlignBottom );
|
||||
|
@ -542,7 +584,6 @@ void Crapview::drawSpeed( QTableWidget* table, QChartView* chart, const QChart::
|
|||
l_chart->addAxis( axisY, Qt::AlignLeft );
|
||||
line->attachAxis( axisY) ;
|
||||
|
||||
// add the chart to the view
|
||||
chart->setChart( l_chart );
|
||||
chart->setRenderHint(QPainter::Antialiasing);
|
||||
}
|
||||
|
@ -571,23 +612,18 @@ void Crapview::drawCount( QTableWidget* table, QChartView* chart, const QChart::
|
|||
return;
|
||||
}
|
||||
|
||||
// std::vector<std::tuple<QString, int>>
|
||||
// [ ( log_item, count ) ]
|
||||
const auto items{ std::move(*result) };
|
||||
|
||||
// make the pie
|
||||
QPieSeries* pie{ new QPieSeries() };
|
||||
// cut off exdceeding elements for the chart
|
||||
const int max_items{ 15 };
|
||||
int count, oth_count{0}, n_rows{0};
|
||||
QString item;
|
||||
int oth_count{0}, n_rows{0};
|
||||
// bring items in reverse order
|
||||
stats_count_items_t::const_reverse_iterator iter = items.crbegin();
|
||||
auto iter{ items.crbegin() };
|
||||
while ( iter != items.crend() ) {
|
||||
item = iter->second;
|
||||
count = iter->first;
|
||||
++iter;
|
||||
if ( n_rows >= max_items ) {
|
||||
const QString& item{ iter->second };
|
||||
const unsigned count{ iter->first };
|
||||
if ( n_rows >= this->count_max_slices ) {
|
||||
oth_count += count;
|
||||
} else {
|
||||
pie->append( item, count );
|
||||
|
@ -598,6 +634,7 @@ void Crapview::drawCount( QTableWidget* table, QChartView* chart, const QChart::
|
|||
table->setItem( n_rows, 0, ic );
|
||||
table->setItem( n_rows, 1, new QTableWidgetItem( item ));
|
||||
++ n_rows;
|
||||
++ iter;
|
||||
}
|
||||
table->verticalHeader()->setVisible( false );
|
||||
|
||||
|
@ -606,7 +643,7 @@ void Crapview::drawCount( QTableWidget* table, QChartView* chart, const QChart::
|
|||
QPieSlice* slice = pie->slices().at( pie->count()-1 );
|
||||
slice->setBrush( Qt::gray );
|
||||
}
|
||||
pie->setPieSize( 0.60 );
|
||||
pie->setPieSize( this->count_pie_size );
|
||||
pie->setLabelsVisible( false );
|
||||
connect( pie, &QPieSeries::clicked, this, &Crapview::sliceClicked );
|
||||
|
||||
|
@ -644,27 +681,26 @@ void Crapview::drawDay( QChartView* chart, const QChart::ChartTheme& theme, cons
|
|||
return;
|
||||
}
|
||||
|
||||
// std::unordered_map<int, std::unordered_map<int, int>>
|
||||
// { hour : { 10th_minutes : count } }
|
||||
const auto items{ std::move(*result) };
|
||||
|
||||
// draw the chart
|
||||
QString date;
|
||||
if ( to_year.isEmpty() || to_month.isEmpty() || to_day.isEmpty() ) {
|
||||
date = PrintSec::printableDate( from_year, this->getMonthNumber(from_month), from_day );
|
||||
} else {
|
||||
date = QStringLiteral("%1 %2 %3 %4").arg(
|
||||
TR::tr( "from" ),
|
||||
PrintSec::printableDate( from_year, this->getMonthNumber(from_month), from_day ),
|
||||
TR::tr( "to" ),
|
||||
PrintSec::printableDate( to_year, this->getMonthNumber(to_month), to_day ) );
|
||||
}
|
||||
|
||||
QColor col{ Qt::GlobalColor::darkGreen };
|
||||
QBarSet* b_10{ new QBarSet("") };
|
||||
b_10->setColor( col );
|
||||
QBarSet* b_20{ new QBarSet("") };
|
||||
b_20->setColor( col );
|
||||
QBarSet* b_30{ new QBarSet("") };
|
||||
if ( to_year.isEmpty() || to_month.isEmpty() || to_day.isEmpty() ) {
|
||||
date = PrintSec::printableDate( from_year, this->getMonthNumber(from_month), from_day );
|
||||
} else {
|
||||
date = QStringLiteral("%1 %2 %3 %4")
|
||||
.arg( TR::tr( "from" ),
|
||||
PrintSec::printableDate( from_year, this->getMonthNumber(from_month), from_day ),
|
||||
TR::tr( "to" ),
|
||||
PrintSec::printableDate( to_year, this->getMonthNumber(to_month), to_day ) );
|
||||
}
|
||||
b_30->setColor( col );
|
||||
QBarSet* b_40{ new QBarSet("") };
|
||||
b_40->setColor( col );
|
||||
|
@ -675,47 +711,36 @@ void Crapview::drawDay( QChartView* chart, const QChart::ChartTheme& theme, cons
|
|||
|
||||
// build the bars upon data
|
||||
int count, max_count{0};
|
||||
const auto check_max_count{ [&count,&max_count](){
|
||||
if ( count > max_count ) max_count = count;
|
||||
}};
|
||||
for ( size_t h{0ul}; h<24ul; ++h ) {
|
||||
auto& data = items.at( h );
|
||||
const auto& data{ items.at( h ) };
|
||||
count = data.at( 0ul );
|
||||
*b_10 << count;
|
||||
if ( count > max_count ) {
|
||||
max_count = count;
|
||||
}
|
||||
check_max_count();
|
||||
count = data.at( 10ul );
|
||||
*b_20 << count;
|
||||
if ( count > max_count ) {
|
||||
max_count = count;
|
||||
}
|
||||
check_max_count();
|
||||
count = data.at( 20ul );
|
||||
*b_30 << count;
|
||||
if ( count > max_count ) {
|
||||
max_count = count;
|
||||
}
|
||||
check_max_count();
|
||||
count = data.at( 30ul );
|
||||
*b_40 << count;
|
||||
if ( count > max_count ) {
|
||||
max_count = count;
|
||||
}
|
||||
check_max_count();
|
||||
count = data.at( 40ul );
|
||||
*b_50 << count;
|
||||
if ( count > max_count ) {
|
||||
max_count = count;
|
||||
}
|
||||
check_max_count();
|
||||
count = data.at( 50ul );
|
||||
*b_60 << count;
|
||||
if ( count > max_count ) {
|
||||
max_count = count;
|
||||
}
|
||||
check_max_count();
|
||||
}
|
||||
|
||||
// apply the bars to the bars serie
|
||||
QBarSeries* bars{ new QBarSeries() };
|
||||
bars->append( b_10 ); bars->append( b_20 ); bars->append( b_30 );
|
||||
bars->append( b_40 ); bars->append( b_50 ); bars->append( b_60 );
|
||||
bars->setBarWidth( 1 );
|
||||
|
||||
// set-up the bars chart
|
||||
QChart* b_chart{ new QChart() };
|
||||
b_chart->setTheme( theme );
|
||||
b_chart->addSeries( bars );
|
||||
|
@ -742,7 +767,6 @@ void Crapview::drawDay( QChartView* chart, const QChart::ChartTheme& theme, cons
|
|||
b_chart->addAxis( axisY, Qt::AlignLeft );
|
||||
bars->attachAxis( axisY) ;
|
||||
|
||||
// apply the chart to the view
|
||||
chart->setChart( b_chart );
|
||||
chart->setRenderHint( QPainter::Antialiasing );
|
||||
}
|
||||
|
@ -762,6 +786,7 @@ void Crapview::drawRelat( QChartView* chart, const QChart::ChartTheme& theme, co
|
|||
} else {
|
||||
this->dbQuery.getRelationalCountsPeriod( result, web_server, from_year, from_month, from_day, to_year, to_month, to_day, field_1, filter_1, field_2, filter_2 );
|
||||
}
|
||||
|
||||
} catch ( const DatabaseException& e ) {
|
||||
DialogSec::errProcessingStatsData( e.what() );
|
||||
return;
|
||||
|
@ -776,11 +801,20 @@ void Crapview::drawRelat( QChartView* chart, const QChart::ChartTheme& theme, co
|
|||
return;
|
||||
}
|
||||
|
||||
// std::vector<std::tuple<long long, int>>
|
||||
// [ ( epoch_ms, count ) ]
|
||||
const auto items{ std::move(*result) };
|
||||
|
||||
// draw the relational chart
|
||||
QString date;
|
||||
if ( ! period ) {
|
||||
date = PrintSec::printableDate( from_year, this->getMonthNumber(from_month), from_day );
|
||||
} else {
|
||||
date = QStringLiteral("%1 %2 %3 %4").arg(
|
||||
TR::tr( "from" ),
|
||||
PrintSec::printableDate( from_year, this->getMonthNumber(from_month), from_day ),
|
||||
TR::tr( "to" ),
|
||||
PrintSec::printableDate( to_year, this->getMonthNumber(to_month), to_day ));
|
||||
}
|
||||
|
||||
QLineSeries* line{ new QLineSeries() };
|
||||
// build the line upon data
|
||||
int max_count{0};
|
||||
|
@ -793,19 +827,7 @@ void Crapview::drawRelat( QChartView* chart, const QChart::ChartTheme& theme, co
|
|||
}
|
||||
}
|
||||
|
||||
// build the area
|
||||
QString date;
|
||||
QAreaSeries* area{ new QAreaSeries( line ) };
|
||||
if ( ! period ) {
|
||||
date = PrintSec::printableDate( from_year, this->getMonthNumber(from_month), from_day );
|
||||
} else {
|
||||
date = QStringLiteral("%1 %2 %3 %4")
|
||||
.arg( TR::tr( "from" ),
|
||||
PrintSec::printableDate( from_year, this->getMonthNumber(from_month), from_day ),
|
||||
TR::tr( "to" ),
|
||||
PrintSec::printableDate( to_year, this->getMonthNumber(to_month), to_day ));
|
||||
}
|
||||
|
||||
// color the area
|
||||
QColor col1{ Qt::GlobalColor::red },
|
||||
col2{ Qt::GlobalColor::yellow },
|
||||
|
@ -829,7 +851,7 @@ void Crapview::drawRelat( QChartView* chart, const QChart::ChartTheme& theme, co
|
|||
a_chart->setTheme( theme );
|
||||
a_chart->addSeries( area );
|
||||
a_chart->addSeries( area_ );
|
||||
a_chart->setTitle( QStringLiteral("%1: %2 -> %3").arg( TR::tr( "Time of Day Count" ), field_1_str, field_2_str) );
|
||||
a_chart->setTitle( QStringLiteral("%1: %2 -> %3").arg( TR::tr( "Relational Count" ), field_1_str, field_2_str) );
|
||||
a_chart->legend()->setVisible( false );
|
||||
/*a_chart->legend()->setFont( fonts.at( "main_small" ) );
|
||||
a_chart->legend()->setAlignment( Qt::AlignBottom );*/
|
||||
|
@ -846,7 +868,7 @@ void Crapview::drawRelat( QChartView* chart, const QChart::ChartTheme& theme, co
|
|||
}
|
||||
axisX->setTickCount( ticks+1 );
|
||||
} else {
|
||||
axisX->setFormat( "hh:mm" );
|
||||
axisX->setFormat( this->relat_time_format );
|
||||
axisX->setTickCount( 25 );
|
||||
}
|
||||
axisX->setTitleText( date );
|
||||
|
@ -861,7 +883,6 @@ void Crapview::drawRelat( QChartView* chart, const QChart::ChartTheme& theme, co
|
|||
a_chart->addAxis( axisY, Qt::AlignLeft );
|
||||
area->attachAxis( axisY) ;
|
||||
|
||||
// add the chart to the view
|
||||
chart->setChart( a_chart );
|
||||
chart->setRenderHint(QPainter::Antialiasing);
|
||||
}
|
||||
|
@ -870,7 +891,7 @@ void Crapview::drawRelat( QChartView* chart, const QChart::ChartTheme& theme, co
|
|||
// calculate global informations
|
||||
bool Crapview::calcGlobals( std::vector<std::tuple<QString,QString>>& recur_list, std::vector<std::tuple<QString,QString>>& traffic_list, std::vector<std::tuple<QString,QString>>& perf_list, std::vector<QString>& work_list, const QString web_server ) const
|
||||
{
|
||||
const auto& avl_dates{ this->dates.at( this->WebServer_s2i.value( web_server ) ) };
|
||||
const auto& avl_dates{ this->dates.at( this->WebServer_s2e.value( web_server ) ) };
|
||||
if ( avl_dates.empty() ) {
|
||||
return false;
|
||||
}
|
||||
|
@ -895,7 +916,6 @@ bool Crapview::calcGlobals( std::vector<std::tuple<QString,QString>>& recur_list
|
|||
return false;
|
||||
}
|
||||
|
||||
// std::vector<std::tuple<long long, int>>
|
||||
// [ ( epoch_ms, count ) ]
|
||||
const GlobalsData data{ std::move(*result) };
|
||||
|
||||
|
|
|
@ -61,14 +61,14 @@ public:
|
|||
void clearDates() noexcept;
|
||||
|
||||
|
||||
//! Returns le list of available years, for the given web server
|
||||
//! Returns the list of available years, for the given web server
|
||||
/*!
|
||||
\param web_server The printable Web Server name
|
||||
\return The list of yearss which are avaliable
|
||||
*/
|
||||
QStringList getYears( const QString& web_server ) const noexcept;
|
||||
|
||||
//! Returns le list of available months in the given year, for the given web server
|
||||
//! Returns the list of available months in the given year, for the given web server
|
||||
/*!
|
||||
\param web_server The printable Web Server name
|
||||
\param year The year
|
||||
|
@ -76,7 +76,7 @@ public:
|
|||
*/
|
||||
QStringList getMonths( const QString& web_server, const QString& year ) const noexcept;
|
||||
|
||||
//! Returns le list of available days in the given month and year, for the given web server
|
||||
//! Returns the list of available days in the given month and year, for the given web server
|
||||
/*!
|
||||
\param web_server The printable Web Server name
|
||||
\param year The year
|
||||
|
@ -107,6 +107,69 @@ public:
|
|||
QStringList getSpeedHeaderColumns() const noexcept;
|
||||
|
||||
|
||||
//! Sets the time interval for the Speed stats
|
||||
/*!
|
||||
\param interval The time interval to use
|
||||
*/
|
||||
void setSpeedTimeInterval( const qint64 interval ) noexcept;
|
||||
|
||||
//! Returns the current time interval for the Speed stats
|
||||
/*!
|
||||
\return The time interval in use
|
||||
*/
|
||||
qint64 getSpeedTimeInterval() const noexcept;
|
||||
|
||||
//! Sets the time format for the Speed labels on the X-axis
|
||||
/*!
|
||||
\param format The format to use
|
||||
*/
|
||||
void setSpeedTimeFormat( const QString& format ) noexcept;
|
||||
|
||||
//! Returns the current time format for the Speed labels on the X-axis
|
||||
/*!
|
||||
\return The time format in use
|
||||
*/
|
||||
const QString& getSpeedTimeFormat() const noexcept;
|
||||
|
||||
|
||||
//! Sets the size of the pie chart for the Count stats
|
||||
/*!
|
||||
\param size The new size
|
||||
*/
|
||||
void setCountPieSize( const qreal size ) noexcept;
|
||||
|
||||
//! Returns the current size of the pie chart for the Count stats
|
||||
/*!
|
||||
\return The size in use
|
||||
*/
|
||||
qreal getCountPieSize() const noexcept;
|
||||
|
||||
//! Sets the maximum number of slices of pie chart for the Count stats
|
||||
/*!
|
||||
\param value The maximum number of slices
|
||||
*/
|
||||
void setCountMaxSlices( const int value ) noexcept;
|
||||
|
||||
//! Returns the current maximum number of slices of pie chart for the Count stats
|
||||
/*!
|
||||
\return The maximum number of slices in use
|
||||
*/
|
||||
int getCountMaxSlices() const noexcept;
|
||||
|
||||
|
||||
//! Sets the time format for the Relational labels on the X-axis
|
||||
/*!
|
||||
\param format The format to use
|
||||
*/
|
||||
void setRelatTimeFormat( const QString& format ) noexcept;
|
||||
|
||||
//! Returns the current time format for the Relational labels on the X-axis
|
||||
/*!
|
||||
\return The time format in use
|
||||
*/
|
||||
const QString& getRelatTimeFormat() const noexcept;
|
||||
|
||||
|
||||
//! Draws the chart and fills the table for the Warnings stats
|
||||
/*!
|
||||
\param table The table widget
|
||||
|
@ -251,9 +314,6 @@ private:
|
|||
// quantity of information to display throught dialogs
|
||||
DialogsLevel dialogs_level{ DL_NORMAL };
|
||||
|
||||
// charts theme ID
|
||||
int charts_theme{ 0 };
|
||||
|
||||
const QColor warning_color{ 255, 140, 0, 255 };
|
||||
|
||||
DbQuery dbQuery;
|
||||
|
@ -263,10 +323,18 @@ private:
|
|||
// { web_server_id : { year : { month : [ days ] } } }
|
||||
database_dates_t dates;
|
||||
|
||||
qint64 speed_interval{ 1ll };
|
||||
QString speed_time_format{ "hh:mm" };
|
||||
|
||||
qreal count_pie_size{ 0.6 };
|
||||
int count_max_slices{ 15 };
|
||||
|
||||
QString relat_time_format{ "hh:mm" };
|
||||
|
||||
|
||||
// converr Web Servers names to Web Server IDs
|
||||
const QHash<QString, int> WebServer_s2i{
|
||||
{"apache",11}, {"nginx",12}, {"iis",13} };
|
||||
const QHash<QString, WebServer> WebServer_s2e{
|
||||
{"apache",WS_APACHE}, {"nginx",WS_NGINX}, {"iis",WS_IIS} };
|
||||
|
||||
// convert months names to months numbers
|
||||
const QHash<QString, int> Months_s2i{
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
using stats_day_items_t = std::unordered_map<int, std::unordered_map<int, int>>;\
|
||||
using stats_relat_items_t = std::vector<std::tuple<qint64, int>>;\
|
||||
using stats_count_items_t = std::multimap<unsigned, QString>;\
|
||||
using database_dates_t = std::map<int, stats_dates_t>;
|
||||
using database_dates_t = std::map<WebServer, stats_dates_t>;
|
||||
|
||||
|
||||
struct RecurrenceData final
|
||||
|
|
|
@ -136,19 +136,17 @@ int DbQuery::countDays( const int from_year, const int from_month, const int fro
|
|||
{
|
||||
int n_days{ 1 };
|
||||
if ( from_year == to_year ) {
|
||||
// 1 year
|
||||
if ( from_month == to_month ) {
|
||||
// 1 month
|
||||
n_days += to_day - from_day + 1;
|
||||
} else {
|
||||
n_days += getMonthDays( from_year, from_month ) - from_day; // first month's days
|
||||
for ( int month=from_month+1; month<to_month; ++month ) {
|
||||
for ( int month{from_month+1}; month<to_month; ++month ) {
|
||||
n_days += getMonthDays( from_year, month );
|
||||
}
|
||||
n_days += to_day; // last month's days
|
||||
}
|
||||
} else {
|
||||
n_days += getMonthDays( from_year, from_month ) - from_day;
|
||||
n_days += getMonthDays( from_year, from_month ) - from_day; // first month's days
|
||||
if ( from_month < 12 ) {
|
||||
for ( int month{from_month+1}; month<=12; ++month ) {
|
||||
n_days += getMonthDays( from_year, month );
|
||||
|
@ -158,7 +156,7 @@ int DbQuery::countDays( const int from_year, const int from_month, const int fro
|
|||
int last_month{ 12 };
|
||||
if ( year == to_year ) {
|
||||
last_month = to_month-1;
|
||||
n_days += to_day; // last month's days, added in advance
|
||||
n_days += to_day; // last month's days
|
||||
}
|
||||
for ( int month{1}; month<=last_month; ++month ) {
|
||||
n_days += getMonthDays( year, month );
|
||||
|
@ -172,19 +170,15 @@ int DbQuery::countMonths( const int from_year, const int from_month, const int t
|
|||
{
|
||||
int n_months{ 0 };
|
||||
if ( from_year == to_year ) {
|
||||
// same year
|
||||
if ( from_month == to_month ) {
|
||||
// same month
|
||||
n_months = 1;
|
||||
} else {
|
||||
// different months
|
||||
n_months = to_month - from_month + 1;
|
||||
}
|
||||
} else {
|
||||
// different years
|
||||
n_months += 13 - from_month; // months to the end of the first year
|
||||
n_months += to_month; // months from the beginning of the last year
|
||||
n_months += 12 * ( to_year - from_year - 1 ); // 12 months for every middle year (0 if none)
|
||||
n_months += 12 * ( to_year - from_year - 1 ); // 12 months for every year in the middle
|
||||
}
|
||||
return n_months;
|
||||
}
|
||||
|
@ -224,7 +218,7 @@ const QString& DbQuery::getDbField( QStringView tr_fld ) const
|
|||
void DbQuery::refreshDates( std::optional<database_dates_t>& result ) noexcept
|
||||
{
|
||||
database_dates_t dates{ // std::unordered_map<int, std::unordered_map<int, std::unordered_map<int, std::vector<int>>>>
|
||||
{11, {}}, {12, {}}, {13, {}}
|
||||
{WS_APACHE, {}}, {WS_NGINX, {}}, {WS_IIS, {}}
|
||||
};
|
||||
|
||||
DatabaseWrapper db{ DatabaseHandler::get( DatabaseType::Data, DB_READONLY ) };
|
||||
|
@ -232,10 +226,11 @@ void DbQuery::refreshDates( std::optional<database_dates_t>& result ) noexcept
|
|||
db.open( this->db_path, this->dialog_level==DL_EXPLANATORY );
|
||||
|
||||
// recursively query years, months and days for every WebServer
|
||||
static const std::vector<std::tuple<int, QString>> tables{
|
||||
std::make_tuple(11,"apache"),
|
||||
std::make_tuple(12,"nginx"),
|
||||
std::make_tuple(13,"iis") };
|
||||
static const std::vector<std::tuple<WebServer, QString>> tables{
|
||||
std::make_tuple( WS_APACHE, QStringLiteral("apache") ),
|
||||
std::make_tuple( WS_NGINX, QStringLiteral("nginx") ),
|
||||
std::make_tuple( WS_IIS, QStringLiteral("iis") )
|
||||
};
|
||||
|
||||
for ( const auto& [ws,tbl] : tables ) {
|
||||
|
||||
|
@ -261,7 +256,7 @@ void DbQuery::refreshDates( std::optional<database_dates_t>& result ) noexcept
|
|||
// get daytime values for the warnings
|
||||
void DbQuery::getWarningsData( std::optional<stats_warn_items_t>& result, QStringView web_server, QStringView year_, QStringView month_, QStringView day_, QStringView hour_ ) const
|
||||
{
|
||||
stats_warn_items_t items; // std::vector<std::vector<std::vector<std::array<QString,18>>>>
|
||||
stats_warn_items_t items;
|
||||
|
||||
DatabaseWrapper db{ DatabaseHandler::get( DatabaseType::Data, DB_READONLY ) };
|
||||
|
||||
|
@ -353,9 +348,9 @@ void DbQuery::getWarningsData( std::optional<stats_warn_items_t>& result, QStrin
|
|||
|
||||
|
||||
// get day-time values for the time-taken field
|
||||
void DbQuery::getSpeedData( std::optional<stats_speed_items_t>& result, QStringView web_server, QStringView year_, QStringView month_, QStringView day_, QStringView protocol_f, QStringView method_f, QStringView uri_f, QStringView query_f, QStringView response_f ) const
|
||||
void DbQuery::getSpeedData( std::optional<stats_speed_items_t>& result, QStringView web_server, QStringView year_, QStringView month_, QStringView day_, QStringView protocol_f, QStringView method_f, QStringView uri_f, QStringView query_f, QStringView response_f, const qint64 time_interval ) const
|
||||
{
|
||||
stats_speed_items_t data; // std::vector<std::tuple<long long, std::array<QString,6>>>
|
||||
stats_speed_items_t data;
|
||||
|
||||
DatabaseWrapper db{ DatabaseHandler::get( DatabaseType::Data, DB_READONLY ) };
|
||||
|
||||
|
@ -401,154 +396,95 @@ void DbQuery::getSpeedData( std::optional<stats_speed_items_t>& result, QStringV
|
|||
return;
|
||||
}
|
||||
|
||||
int h, m, s;
|
||||
const auto prev_instant{
|
||||
[&h,&m,&s](const int hour, const int minute, const int second)
|
||||
{
|
||||
h=hour; m=minute; s=second;
|
||||
if ( --s < 0 ) { s=59;
|
||||
if ( --m < 0 ) { m=59;
|
||||
if ( --h < 0 ) { h=m=s=0; }}}
|
||||
}
|
||||
};
|
||||
const auto next_instant{
|
||||
[&h,&m,&s](const int hour, const int minute, const int second)
|
||||
{
|
||||
h=hour; m=minute; s=second;
|
||||
if ( ++s > 59 ) { s=0;
|
||||
if ( ++m > 59 ) { m=0;
|
||||
if ( ++h > 23 ) { h=23;m=59;s=59; }}}
|
||||
}
|
||||
};
|
||||
|
||||
using data_t = std::array<QString,6>;
|
||||
|
||||
data_t query_data{};
|
||||
|
||||
QDateTime time{
|
||||
QDate( year, month, day ),
|
||||
QTime( 0, 0, 0 )
|
||||
};
|
||||
QDateTime current_interval{ time }, next_interval{ time };
|
||||
|
||||
const auto push_empty{
|
||||
[&data,&time]()
|
||||
[&data,¤t_interval]()
|
||||
{
|
||||
data.emplace_back( time.toMSecsSinceEpoch(), data_t{} );
|
||||
data.emplace_back( current_interval.toMSecsSinceEpoch(), data_t{} );
|
||||
}
|
||||
};
|
||||
const auto push_data{
|
||||
[&data,&time](const auto ...args)
|
||||
[&data,¤t_interval,&query_data]()
|
||||
{
|
||||
data.emplace_back( time.toMSecsSinceEpoch(), data_t{args...} );
|
||||
data.emplace_back( current_interval.toMSecsSinceEpoch(), query_data );
|
||||
}
|
||||
};
|
||||
|
||||
const auto set_time{
|
||||
[&time](const auto ...args)
|
||||
[&time](const QueryWrapper& query)
|
||||
{
|
||||
time.setTime( QTime(args...) );
|
||||
time.setTime( QTime( toInt(query[0]), toInt(query[1]), toInt(query[2]) ) );
|
||||
}
|
||||
};
|
||||
|
||||
int hour{-1}, next_hour, prev_hour{0},
|
||||
minute{0}, next_minute, prev_minute{0},
|
||||
second{0}, next_second, prev_second{0};
|
||||
QString tt, ur, qr, mt, pt, rs;
|
||||
const auto set_data{
|
||||
[&query_data](const QueryWrapper& query)
|
||||
{
|
||||
query_data = data_t{
|
||||
toString( query[3] ), // time taken
|
||||
toString( query[4] ), // uri
|
||||
toString( query[5] ), // query
|
||||
toString( query[6] ), // method
|
||||
toString( query[7] ), // protocol
|
||||
toString( query[8] ) // response
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
const auto in_current_interval{
|
||||
[¤t_interval,&next_interval,&time]()->bool
|
||||
{
|
||||
return current_interval <= time && time < next_interval;
|
||||
}
|
||||
};
|
||||
|
||||
const auto increase_intervals{
|
||||
[¤t_interval,&next_interval,&time_interval]()
|
||||
{
|
||||
current_interval = next_interval;
|
||||
next_interval.setSecsSinceEpoch( next_interval.toSecsSinceEpoch() + time_interval );
|
||||
}
|
||||
};
|
||||
|
||||
// append the first ficticious count
|
||||
time.setMSecsSinceEpoch( time.toMSecsSinceEpoch() - 1000 ); // -1s
|
||||
push_empty();
|
||||
time.setMSecsSinceEpoch( time.toMSecsSinceEpoch() + 1000 ); // +1s
|
||||
|
||||
while ( query->next() ) {
|
||||
next_hour = toInt( query[0] );
|
||||
next_minute = toInt( query[1] );
|
||||
next_second = toInt( query[2] );
|
||||
set_time( query );
|
||||
set_data( query );
|
||||
|
||||
if ( next_hour == hour && next_minute == minute && next_second == second ) {
|
||||
set_time( hour, minute, second );
|
||||
push_data( tt,ur,qr,mt,pt,rs );
|
||||
if ( in_current_interval() ) {
|
||||
push_data();
|
||||
} else {
|
||||
if ( next_hour == hour ) {
|
||||
prev_instant( hour, minute, second );
|
||||
// append the second before the last one found, if it is not equal to the prev
|
||||
if ( prev_hour < h || prev_minute < m || prev_second < s ) {
|
||||
set_time( h, m, s );
|
||||
push_empty();
|
||||
}
|
||||
// same hour new minute/second, append the last count
|
||||
set_time( hour, minute, second );
|
||||
push_data( tt,ur,qr,mt,pt,rs );
|
||||
// append the second after the last one found, if it is not equal to the next
|
||||
next_instant( hour, minute, second );
|
||||
if ( next_hour > h || next_minute > m || next_second > s ) {
|
||||
set_time( h, m, s );
|
||||
push_empty();
|
||||
}
|
||||
prev_hour = hour; // update now to avoid getting next_hour's value
|
||||
} else {
|
||||
// minute & second are always different when the hour is different
|
||||
if ( hour >= 0 ) {
|
||||
// append the prev as zero
|
||||
prev_instant( hour, minute, second );
|
||||
if ( prev_hour < h || prev_minute < m || prev_second < s ) {
|
||||
set_time( h, m, s );
|
||||
push_empty();
|
||||
}
|
||||
// apend the last p count if not in the first round of the loop
|
||||
set_time( hour, minute, second );
|
||||
push_data( tt,ur,qr,mt,pt,rs );
|
||||
// append the next as zero
|
||||
next_instant( hour, minute, second );
|
||||
if ( next_hour > h || next_minute > m || next_second > s ) {
|
||||
set_time( h, m, s );
|
||||
push_empty();
|
||||
}
|
||||
} else {
|
||||
// hout < 0 only in the first round of the loop
|
||||
// append the second 0 of the day, if it is not the one found
|
||||
if ( next_hour > 0 || next_minute > 0 || next_second > 0 ) {
|
||||
push_empty();
|
||||
// append the second before the first found
|
||||
prev_instant( next_hour, next_minute, next_second );
|
||||
if ( h > 0 || m > 0 || s > 0 ) {
|
||||
set_time( h, m, s );
|
||||
push_empty();
|
||||
}
|
||||
}
|
||||
}
|
||||
prev_hour = hour;
|
||||
hour = next_hour;
|
||||
increase_intervals();
|
||||
if ( ! in_current_interval() ) {
|
||||
push_empty();
|
||||
do { increase_intervals(); }
|
||||
while ( ! in_current_interval() );
|
||||
push_empty();
|
||||
}
|
||||
prev_minute = minute;
|
||||
minute = next_minute;
|
||||
prev_second = second;
|
||||
second = next_second;
|
||||
push_data();
|
||||
}
|
||||
tt = toString( query[3] ); // time taken
|
||||
ur = toString( query[4] ); // uri
|
||||
qr = toString( query[5] ); // query
|
||||
mt = toString( query[6] ); // method
|
||||
pt = toString( query[7] ); // protocol
|
||||
rs = toString( query[8] ); // response
|
||||
}
|
||||
// last one, append the prev count
|
||||
prev_instant( hour, minute, second );
|
||||
if ( prev_hour < h || prev_minute < m || prev_second < s ) {
|
||||
set_time( h, m, s );
|
||||
|
||||
increase_intervals();
|
||||
if ( ! in_current_interval() ) {
|
||||
push_empty();
|
||||
}
|
||||
// append the last count
|
||||
set_time( hour, minute, second );
|
||||
push_data( tt,ur,qr,mt,pt,rs );
|
||||
if ( hour < 23 && minute < 59 && second < 59 ) {
|
||||
// append 1 second after the last
|
||||
next_instant( hour, minute, second );
|
||||
set_time( h, m, s );
|
||||
push_empty();
|
||||
}
|
||||
// append the last fictitious count
|
||||
|
||||
time.setTime( QTime( 23, 59, 59 ) );
|
||||
time.setMSecsSinceEpoch( time.toMSecsSinceEpoch() + 1000 ); // +1s
|
||||
push_empty();
|
||||
if ( time > current_interval ) {
|
||||
current_interval.setSecsSinceEpoch( time.toSecsSinceEpoch()+1 );
|
||||
push_empty();
|
||||
}
|
||||
|
||||
if ( data.capacity() > data.size() ) {
|
||||
data.shrink_to_fit();
|
||||
|
@ -563,7 +499,7 @@ void DbQuery::getSpeedData( std::optional<stats_speed_items_t>& result, QStringV
|
|||
void DbQuery::getItemsCount( std::optional<stats_count_items_t>& result, QStringView web_server, QStringView year, QStringView month, QStringView day, QStringView log_field ) const
|
||||
{
|
||||
QHash<QString, unsigned> aux_items;
|
||||
stats_count_items_t items; // std::map<QString, unsigned int>>
|
||||
stats_count_items_t items;
|
||||
|
||||
DatabaseWrapper db{ DatabaseHandler::get( DatabaseType::Data, DB_READONLY ) };
|
||||
|
||||
|
@ -610,7 +546,7 @@ void DbQuery::getItemsCount( std::optional<stats_count_items_t>& result, QString
|
|||
// get and count items with a 10 minutes gap for every hour of the day
|
||||
void DbQuery::getDaytimeCounts( std::optional<stats_day_items_t>& result, QStringView web_server, QStringView from_year_, QStringView from_month_, QStringView from_day_, QStringView to_year_, QStringView to_month_, QStringView to_day_, const LogField log_field_, QStringView field_filter ) const
|
||||
{
|
||||
stats_day_items_t data{ // std::unordered_map<int, std::unordered_map<int, int>>
|
||||
stats_day_items_t data{
|
||||
{0, {{0,0},{10,0},{20,0},{30,0},{40,0},{50,0}}}, {1, {{0,0},{10,0},{20,0},{30,0},{40,0},{50,0}}},
|
||||
{2, {{0,0},{10,0},{20,0},{30,0},{40,0},{50,0}}}, {3, {{0,0},{10,0},{20,0},{30,0},{40,0},{50,0}}},
|
||||
{4, {{0,0},{10,0},{20,0},{30,0},{40,0},{50,0}}}, {5, {{0,0},{10,0},{20,0},{30,0},{40,0},{50,0}}},
|
||||
|
@ -743,7 +679,7 @@ void DbQuery::getDaytimeCounts( std::optional<stats_day_items_t>& result, QStrin
|
|||
// get and count how many times a specific item value brought to another
|
||||
void DbQuery::getRelationalCountsDay( std::optional<stats_relat_items_t>& result, QStringView web_server, QStringView year_, QStringView month_, QStringView day_, const LogField log_field_1_, QStringView field_filter_1, const LogField log_field_2_, QStringView field_filter_2 ) const
|
||||
{
|
||||
stats_relat_items_t data; // std::vector<std::tuple<qint64, int>>
|
||||
stats_relat_items_t data;
|
||||
int gap = 20;
|
||||
|
||||
DatabaseWrapper db{ DatabaseHandler::get( DatabaseType::Data, DB_READONLY ) };
|
||||
|
@ -888,7 +824,7 @@ void DbQuery::getRelationalCountsDay( std::optional<stats_relat_items_t>& result
|
|||
|
||||
void DbQuery::getRelationalCountsPeriod( std::optional<stats_relat_items_t>& result, QStringView web_server, QStringView from_year_, QStringView from_month_, QStringView from_day_, QStringView to_year_, QStringView to_month_, QStringView to_day_, const LogField log_field_1_, QStringView field_filter_1, const LogField log_field_2_, QStringView field_filter_2 ) const
|
||||
{
|
||||
stats_relat_items_t data; // std::vector<std::tuple<qint64, int>>
|
||||
stats_relat_items_t data;
|
||||
|
||||
DatabaseWrapper db{ DatabaseHandler::get( DatabaseType::Data, DB_READONLY ) };
|
||||
|
||||
|
@ -1143,7 +1079,7 @@ void DbQuery::getGlobalCounts( std::optional<GlobalsData>& result, QStringView w
|
|||
db.open( this->db_path, this->dialog_level==DL_EXPLANATORY );
|
||||
|
||||
bool no_data{ true };
|
||||
int max_date_year, max_date_month, max_date_day;
|
||||
int max_date_year{0}, max_date_month{0}, max_date_day{0};
|
||||
double n_days{0.0};
|
||||
size_t max_date_count{0};
|
||||
std::array<double, 7> week_days_count{ 0, 0, 0, 0, 0, 0, 0 };
|
||||
|
|
|
@ -126,6 +126,7 @@ public:
|
|||
\param uri_f The filter for the URI field
|
||||
\param query_f The filter for the Query field
|
||||
\param response_f The filter for the Response field
|
||||
\param time_interval The time interval used to group the values
|
||||
\throw VoidException
|
||||
\throw CrapviewException
|
||||
\throw ConversionException
|
||||
|
@ -141,7 +142,8 @@ public:
|
|||
QStringView method_f,
|
||||
QStringView uri_f,
|
||||
QStringView query_f,
|
||||
QStringView response_f
|
||||
QStringView response_f,
|
||||
const qint64 time_interval
|
||||
) const;
|
||||
|
||||
|
||||
|
|
|
@ -13,6 +13,9 @@
|
|||
#include <unordered_map> // leave this here for clang
|
||||
|
||||
|
||||
namespace /*private*/
|
||||
{
|
||||
|
||||
enum StyleId : uint32_t {
|
||||
TEXT,
|
||||
WINDOW,
|
||||
|
@ -138,6 +141,8 @@ QString getStylesheet()
|
|||
"}";
|
||||
}
|
||||
|
||||
} //namespace (private)
|
||||
|
||||
|
||||
DialogMsg::DialogMsg(const QString& title, const QString& text, const QString& additional, const MsgType type, QWidget* parent )
|
||||
: QDialog{ parent }
|
||||
|
|
After Width: | Height: | Size: 360 B |
After Width: | Height: | Size: 656 B |
After Width: | Height: | Size: 558 B |
After Width: | Height: | Size: 920 B |
After Width: | Height: | Size: 499 B |
After Width: | Height: | Size: 767 B |
After Width: | Height: | Size: 736 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 357 B |
After Width: | Height: | Size: 711 B |
After Width: | Height: | Size: 613 B |
After Width: | Height: | Size: 1023 B |
After Width: | Height: | Size: 492 B |
After Width: | Height: | Size: 827 B |
After Width: | Height: | Size: 810 B |
After Width: | Height: | Size: 1.1 KiB |
|
@ -23,7 +23,9 @@
|
|||
<file>icons/dark/combobox_arrow.png</file>
|
||||
<file>icons/dark/conf_blacklists.png</file>
|
||||
<file>icons/dark/conf_charts.png</file>
|
||||
<file>icons/dark/conf_charts_style.png</file>
|
||||
<file>icons/dark/conf_control.png</file>
|
||||
<file>icons/dark/conf_count.png</file>
|
||||
<file>icons/dark/conf_databases.png</file>
|
||||
<file>icons/dark/conf_defaults.png</file>
|
||||
<file>icons/dark/conf_dialogs.png</file>
|
||||
|
@ -33,6 +35,8 @@
|
|||
<file>icons/dark/conf_off.png</file>
|
||||
<file>icons/dark/conf_on.png</file>
|
||||
<file>icons/dark/conf_path.png</file>
|
||||
<file>icons/dark/conf_relational.png</file>
|
||||
<file>icons/dark/conf_speed.png</file>
|
||||
<file>icons/dark/conf_textbrowser.png</file>
|
||||
<file>icons/dark/conf_warnlists.png</file>
|
||||
<file>icons/dark/conf_webservers.png</file>
|
||||
|
@ -75,7 +79,9 @@
|
|||
<file>icons/dark_native/checking.png</file>
|
||||
<file>icons/dark_native/conf_blacklists.png</file>
|
||||
<file>icons/dark_native/conf_charts.png</file>
|
||||
<file>icons/dark_native/conf_charts_style.png</file>
|
||||
<file>icons/dark_native/conf_control.png</file>
|
||||
<file>icons/dark_native/conf_count.png</file>
|
||||
<file>icons/dark_native/conf_databases.png</file>
|
||||
<file>icons/dark_native/conf_defaults.png</file>
|
||||
<file>icons/dark_native/conf_dialogs.png</file>
|
||||
|
@ -85,6 +91,8 @@
|
|||
<file>icons/dark_native/conf_off.png</file>
|
||||
<file>icons/dark_native/conf_on.png</file>
|
||||
<file>icons/dark_native/conf_path.png</file>
|
||||
<file>icons/dark_native/conf_relational.png</file>
|
||||
<file>icons/dark_native/conf_speed.png</file>
|
||||
<file>icons/dark_native/conf_textbrowser.png</file>
|
||||
<file>icons/dark_native/conf_warnlists.png</file>
|
||||
<file>icons/dark_native/conf_webservers.png</file>
|
||||
|
@ -132,7 +140,9 @@
|
|||
<file>icons/light/combobox_arrow.png</file>
|
||||
<file>icons/light/conf_blacklists.png</file>
|
||||
<file>icons/light/conf_charts.png</file>
|
||||
<file>icons/light/conf_charts_style.png</file>
|
||||
<file>icons/light/conf_control.png</file>
|
||||
<file>icons/light/conf_count.png</file>
|
||||
<file>icons/light/conf_databases.png</file>
|
||||
<file>icons/light/conf_defaults.png</file>
|
||||
<file>icons/light/conf_dialogs.png</file>
|
||||
|
@ -142,6 +152,8 @@
|
|||
<file>icons/light/conf_off.png</file>
|
||||
<file>icons/light/conf_on.png</file>
|
||||
<file>icons/light/conf_path.png</file>
|
||||
<file>icons/light/conf_relational.png</file>
|
||||
<file>icons/light/conf_speed.png</file>
|
||||
<file>icons/light/conf_textbrowser.png</file>
|
||||
<file>icons/light/conf_warnlists.png</file>
|
||||
<file>icons/light/conf_webservers.png</file>
|
||||
|
@ -184,7 +196,9 @@
|
|||
<file>icons/light_native/checking.png</file>
|
||||
<file>icons/light_native/conf_blacklists.png</file>
|
||||
<file>icons/light_native/conf_charts.png</file>
|
||||
<file>icons/light_native/conf_charts_style.png</file>
|
||||
<file>icons/light_native/conf_control.png</file>
|
||||
<file>icons/light_native/conf_count.png</file>
|
||||
<file>icons/light_native/conf_databases.png</file>
|
||||
<file>icons/light_native/conf_defaults.png</file>
|
||||
<file>icons/light_native/conf_dialogs.png</file>
|
||||
|
@ -194,6 +208,8 @@
|
|||
<file>icons/light_native/conf_off.png</file>
|
||||
<file>icons/light_native/conf_on.png</file>
|
||||
<file>icons/light_native/conf_path.png</file>
|
||||
<file>icons/light_native/conf_relational.png</file>
|
||||
<file>icons/light_native/conf_speed.png</file>
|
||||
<file>icons/light_native/conf_textbrowser.png</file>
|
||||
<file>icons/light_native/conf_warnlists.png</file>
|
||||
<file>icons/light_native/conf_webservers.png</file>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
#include "main_lib.h"
|
||||
|
||||
#include "utilities/arrays.h"
|
||||
#include "utilities/io.h"
|
||||
#include "utilities/strings.h"
|
||||
#include "utilities/vectors.h"
|
||||
|
@ -444,6 +445,54 @@ bool testUtilities()
|
|||
T_ASSERT_NOT( VecOps::contains<std::string>({"catch","the","flag"}, "flac") );
|
||||
T_TEST_RESULT()
|
||||
|
||||
|
||||
//// ARRAYS ////
|
||||
|
||||
T_TEST_START("IsStdArray")
|
||||
{
|
||||
using Array = std::array<int,3>;
|
||||
T_ASSERT( IsStdArray<Array> );
|
||||
}{
|
||||
using Vector = std::vector<int>;
|
||||
T_ASSERT_NOT( IsStdArray<Vector> );
|
||||
}
|
||||
T_TEST_RESULT()
|
||||
|
||||
T_TEST_START("ArrayOps::zip")
|
||||
{
|
||||
const auto equality{ [](ZippedArrays<std::array<int,3>>& zipped, std::array<std::tuple<int,int>,3>& fake_zipped) -> bool {
|
||||
size_t i{ 0ul };
|
||||
for (const auto& tpl : zipped) {
|
||||
if ( tpl != fake_zipped.at(i) ) return false;
|
||||
++i;
|
||||
}
|
||||
return true;
|
||||
}};
|
||||
std::array<int,3> a1{ 1,2,3 };
|
||||
std::array<int,3> a2{ 10,20,30 };
|
||||
std::array<std::tuple<int,int>,3> t{ std::make_tuple(1,10),std::make_tuple(2,20),std::make_tuple(3,30) };
|
||||
ZippedArrays v{ ArrayOps::zip( a1, a2 ) };
|
||||
T_ASSERT( equality( v, t) );
|
||||
}
|
||||
T_TEST_RESULT()
|
||||
|
||||
T_TEST_START("ArrayOps::enumerate")
|
||||
{
|
||||
const auto equality{ [](EnumeratedArray<std::array<int,3>>& enumerated, std::array<std::tuple<int,int>,3>& fake_enumerated) -> bool {
|
||||
size_t i{ 0ul };
|
||||
for (const auto& tpl : enumerated) {
|
||||
if ( tpl != fake_enumerated.at(i) ) return false;
|
||||
++i;
|
||||
}
|
||||
return true;
|
||||
}};
|
||||
std::array<int,3> a{ 10,20,30 };
|
||||
std::array<std::tuple<int,int>,3> t{ std::make_tuple(0,10),std::make_tuple(1,20),std::make_tuple(2,30) };
|
||||
EnumeratedArray v{ ArrayOps::enumerate( a ) };
|
||||
T_ASSERT( equality( v, t) );
|
||||
}
|
||||
T_TEST_RESULT()
|
||||
|
||||
T_FIN()
|
||||
}
|
||||
|
||||
|
|
|
@ -251,6 +251,26 @@
|
|||
<source>Redesigned configs section</source>
|
||||
<translation>Redesigned configs section</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Version 4</source>
|
||||
<translation>Version 4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Stability improvements</source>
|
||||
<translation>Stability improvements</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generating warnings dinamically</source>
|
||||
<translation>Generating warnings dinamically</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>New tool:</source>
|
||||
<translation>New tool:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation>Changelog</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Crapinfo</name>
|
||||
|
@ -1735,6 +1755,136 @@ Any field not considered by LogDoctor will appear as 'DISCARDED'</tran
|
|||
<source>Show the changelog</source>
|
||||
<translation>Show the changelog</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Speed</source>
|
||||
<translation>Speed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Represents a step in the time axis, in seconds.
|
||||
All the values falling inside the same interval will be merged and the mean value will be used.</source>
|
||||
<translation>Represents a step in the time axis, in seconds. All the values falling inside the same interval will be merged and the mean value will be used.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Time interval</source>
|
||||
<translation>Time interval</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1</source>
|
||||
<translation>1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>2</source>
|
||||
<translation>2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3</source>
|
||||
<translation>3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>4</source>
|
||||
<translation>4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>5</source>
|
||||
<translation>5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>10</source>
|
||||
<translation>10</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>15</source>
|
||||
<translation>15</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>20</source>
|
||||
<translation>20</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>30</source>
|
||||
<translation>30</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>60</source>
|
||||
<translation>60</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>120</source>
|
||||
<translation>120</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>180</source>
|
||||
<translation>180</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>240</source>
|
||||
<translation>240</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>300</source>
|
||||
<translation>300</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>600</source>
|
||||
<translation>600</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>900</source>
|
||||
<translation>900</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1200</source>
|
||||
<translation>1200</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1800</source>
|
||||
<translation>1800</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3600</source>
|
||||
<translation>3600</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The format to use for the labels of the time axis.</source>
|
||||
<translation>The format to use for the labels of the time axis.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Time format</source>
|
||||
<translation>Time format</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>hh:mm</source>
|
||||
<translation>hh:mm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>hh</source>
|
||||
<translation>hh</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The size of the pie</source>
|
||||
<translation>The size of the pie</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Pie size</source>
|
||||
<translation>Pie size</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The maximum number of slices that the pie will be composed of.
|
||||
Exceeding slices will be grouped into one comprehensive slice.</source>
|
||||
<translation>The maximum number of slices that the pie will be composed of. Exceeding slices will be grouped into one comprehensive slice.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum slices</source>
|
||||
<translation>Maximum slices</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relational</source>
|
||||
<translation>Relational</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Appearance</source>
|
||||
<translation>Appearance</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>RichText</name>
|
||||
|
@ -2036,5 +2186,9 @@ Any field not considered by LogDoctor will appear as 'DISCARDED'</tran
|
|||
<source>Saturday</source>
|
||||
<translation>Saturday</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relational Count</source>
|
||||
<translation>Relational Count</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
|
|
@ -251,6 +251,26 @@
|
|||
<source>Redesigned configs section</source>
|
||||
<translation type="unfinished">Sección de configuraciones rediseñada</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Version 4</source>
|
||||
<translation type="unfinished">Versión 4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Stability improvements</source>
|
||||
<translation type="unfinished">Mejoras de estabilidad</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generating warnings dinamically</source>
|
||||
<translation type="unfinished">Generación dinámica de avisos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>New tool:</source>
|
||||
<translation type="unfinished">Nueva herramienta:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation type="unfinished">Registro de cambios</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Crapinfo</name>
|
||||
|
@ -1738,6 +1758,138 @@ Los campos marcados como 'DISCARDED' se analizaron correctamente, pero
|
|||
<source>Show the changelog</source>
|
||||
<translation type="unfinished">Mostrar el registro de cambios</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Speed</source>
|
||||
<translation type="unfinished">Velocidad</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Represents a step in the time axis, in seconds.
|
||||
All the values falling inside the same interval will be merged and the mean value will be used.</source>
|
||||
<translation type="unfinished">Representa un paso en el eje del tiempo, en segundos.
|
||||
Todos los valores que se encuentren dentro del mismo intervalo se fusionarán y se utilizará el valor medio.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Time interval</source>
|
||||
<translation type="unfinished">Intervalo de tiempo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1</source>
|
||||
<translation>1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>2</source>
|
||||
<translation>2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3</source>
|
||||
<translation>3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>4</source>
|
||||
<translation>4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>5</source>
|
||||
<translation>5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>10</source>
|
||||
<translation>10</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>15</source>
|
||||
<translation>15</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>20</source>
|
||||
<translation>20</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>30</source>
|
||||
<translation>30</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>60</source>
|
||||
<translation>60</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>120</source>
|
||||
<translation>120</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>180</source>
|
||||
<translation>180</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>240</source>
|
||||
<translation>240</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>300</source>
|
||||
<translation>300</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>600</source>
|
||||
<translation>600</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>900</source>
|
||||
<translation>900</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1200</source>
|
||||
<translation>1200</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1800</source>
|
||||
<translation>1800</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3600</source>
|
||||
<translation>3600</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The format to use for the labels of the time axis.</source>
|
||||
<translation type="unfinished">El formato a utilizar para las etiquetas del eje de tiempo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Time format</source>
|
||||
<translation type="unfinished">Formato del tiempo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>hh:mm</source>
|
||||
<translation type="unfinished">hh:mm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>hh</source>
|
||||
<translation type="unfinished">hh</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The size of the pie</source>
|
||||
<translation type="unfinished">El tamaño del gráfico circular</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Pie size</source>
|
||||
<translation type="unfinished">Tamaño del pastel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The maximum number of slices that the pie will be composed of.
|
||||
Exceeding slices will be grouped into one comprehensive slice.</source>
|
||||
<translation type="unfinished">El número máximo de porciones de las que estará compuesto el pastel.
|
||||
Los sectores excedentes se agruparán en un sector comprensivo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum slices</source>
|
||||
<translation type="unfinished">Rebanadas máximas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relational</source>
|
||||
<translation type="unfinished">Relacional</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Appearance</source>
|
||||
<translation type="unfinished">Apariencia</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>RichText</name>
|
||||
|
@ -2039,5 +2191,9 @@ Los campos marcados como 'DISCARDED' se analizaron correctamente, pero
|
|||
<source>Saturday</source>
|
||||
<translation>Sábado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relational Count</source>
|
||||
<translation type="unfinished">Recuento relacional</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
|
|
@ -251,6 +251,26 @@
|
|||
<source>Redesigned configs section</source>
|
||||
<translation type="unfinished">Section de configuration repensée</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Version 4</source>
|
||||
<translation type="unfinished">Version 4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Stability improvements</source>
|
||||
<translation type="unfinished">Améliorations de la stabilité</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generating warnings dinamically</source>
|
||||
<translation type="unfinished">Génération dynamique des alertes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>New tool:</source>
|
||||
<translation type="unfinished">Nouvel outil:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation type="unfinished">Journal des modifications</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Crapinfo</name>
|
||||
|
@ -1738,6 +1758,138 @@ Les champs marqués comme 'DISCARDED' ont été analysés correctement
|
|||
<source>Show the changelog</source>
|
||||
<translation type="unfinished">Afficher le journal des modifications</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Speed</source>
|
||||
<translation type="unfinished">Vitesse</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Represents a step in the time axis, in seconds.
|
||||
All the values falling inside the same interval will be merged and the mean value will be used.</source>
|
||||
<translation type="unfinished">Représente une étape sur l'axe du temps, en secondes.
|
||||
Toutes les valeurs comprises dans le même intervalle seront fusionnées et la valeur moyenne sera utilisée.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Time interval</source>
|
||||
<translation type="unfinished">Intervalle de temps</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1</source>
|
||||
<translation>1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>2</source>
|
||||
<translation>2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3</source>
|
||||
<translation>3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>4</source>
|
||||
<translation>4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>5</source>
|
||||
<translation>5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>10</source>
|
||||
<translation>10</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>15</source>
|
||||
<translation>15</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>20</source>
|
||||
<translation>20</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>30</source>
|
||||
<translation>30</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>60</source>
|
||||
<translation>60</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>120</source>
|
||||
<translation>120</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>180</source>
|
||||
<translation>180</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>240</source>
|
||||
<translation>240</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>300</source>
|
||||
<translation>300</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>600</source>
|
||||
<translation>600</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>900</source>
|
||||
<translation>900</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1200</source>
|
||||
<translation>1200</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1800</source>
|
||||
<translation>1800</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3600</source>
|
||||
<translation>3600</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The format to use for the labels of the time axis.</source>
|
||||
<translation type="unfinished">Le format à utiliser pour les étiquettes de l'axe du temps.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Time format</source>
|
||||
<translation type="unfinished">Format de l'heure</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>hh:mm</source>
|
||||
<translation type="unfinished">hh:mm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>hh</source>
|
||||
<translation type="unfinished">hh</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The size of the pie</source>
|
||||
<translation type="unfinished">La taille du diagramme circulaire</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Pie size</source>
|
||||
<translation type="unfinished">Taille de la tarte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The maximum number of slices that the pie will be composed of.
|
||||
Exceeding slices will be grouped into one comprehensive slice.</source>
|
||||
<translation type="unfinished">Le nombre maximum de tranches dont la tarte sera composée.
|
||||
Les tranches excédentaires seront regroupées en une seule tranche compréhensif.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum slices</source>
|
||||
<translation type="unfinished">Tranches maximales</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relational</source>
|
||||
<translation type="unfinished">Relationnelle</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Appearance</source>
|
||||
<translation type="unfinished">Apparence</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>RichText</name>
|
||||
|
@ -2039,5 +2191,9 @@ Les champs marqués comme 'DISCARDED' ont été analysés correctement
|
|||
<source>Saturday</source>
|
||||
<translation type="unfinished">Samedi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relational Count</source>
|
||||
<translation type="unfinished">Nombre relationnel</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
|
|
@ -251,6 +251,26 @@
|
|||
<source>Redesigned configs section</source>
|
||||
<translation>Ridisegnata la sezione delle configurazioni</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Version 4</source>
|
||||
<translation>Versione 4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Stability improvements</source>
|
||||
<translation>Miglioramenti alla stabilità</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generating warnings dinamically</source>
|
||||
<translation>Generazione dinamica degli avvertimenti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>New tool:</source>
|
||||
<translation>Nuovo attrezzo:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation>Cambiamenti</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Crapinfo</name>
|
||||
|
@ -1739,6 +1759,138 @@ I campi non considerati da LogDocrot appariranno come 'DISCARDED'</tra
|
|||
<source>Show the changelog</source>
|
||||
<translation>Mostra i cambiamenti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Speed</source>
|
||||
<translation>Velocità</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Represents a step in the time axis, in seconds.
|
||||
All the values falling inside the same interval will be merged and the mean value will be used.</source>
|
||||
<translation>Rappresenta l'intervallo nell'asse del tempo, in secondi.
|
||||
Tutti i valori appartenenti allo stesso intervallo verranno accumulati e sarà usato il valore medio.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Time interval</source>
|
||||
<translation>Intervallo di tempo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1</source>
|
||||
<translation>1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>2</source>
|
||||
<translation>2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3</source>
|
||||
<translation>3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>4</source>
|
||||
<translation>4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>5</source>
|
||||
<translation>5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>10</source>
|
||||
<translation>10</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>15</source>
|
||||
<translation>15</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>20</source>
|
||||
<translation>20</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>30</source>
|
||||
<translation>30</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>60</source>
|
||||
<translation>60</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>120</source>
|
||||
<translation>120</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>180</source>
|
||||
<translation>180</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>240</source>
|
||||
<translation>240</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>300</source>
|
||||
<translation>300</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>600</source>
|
||||
<translation>600</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>900</source>
|
||||
<translation>900</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1200</source>
|
||||
<translation>1200</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1800</source>
|
||||
<translation>1800</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3600</source>
|
||||
<translation>3600</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The format to use for the labels of the time axis.</source>
|
||||
<translation>Il formato da usare per le etichette dell'asse del tempo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Time format</source>
|
||||
<translation>Formato dell'orario</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>hh:mm</source>
|
||||
<translation>hh:mm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>hh</source>
|
||||
<translation>hh</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The size of the pie</source>
|
||||
<translation>La dimensione del grafico a torta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Pie size</source>
|
||||
<translation>Dimensione del grafico</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The maximum number of slices that the pie will be composed of.
|
||||
Exceeding slices will be grouped into one comprehensive slice.</source>
|
||||
<translation>Il numero massimo di fette in cui verrà diviso il grafico a torta.
|
||||
Le porzioni in eccesso verratto raggruppate in una singola fetta.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum slices</source>
|
||||
<translation>Massimo numero di fette</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relational</source>
|
||||
<translation>Relazionale</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Appearance</source>
|
||||
<translation>Aspetto</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>RichText</name>
|
||||
|
@ -2040,5 +2192,9 @@ I campi non considerati da LogDocrot appariranno come 'DISCARDED'</tra
|
|||
<source>Saturday</source>
|
||||
<translation>Sabato</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relational Count</source>
|
||||
<translation>Conteggio relazionale</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
|
|
@ -251,6 +251,26 @@
|
|||
<source>Redesigned configs section</source>
|
||||
<translation type="unfinished">再設計された構成セクション</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Version 4</source>
|
||||
<translation type="unfinished">バージョン4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Stability improvements</source>
|
||||
<translation type="unfinished">安定性の向上</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generating warnings dinamically</source>
|
||||
<translation type="unfinished">警告の動的な生成</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>New tool:</source>
|
||||
<translation type="unfinished">新しいツール:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation type="unfinished">変更履歴</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Crapinfo</name>
|
||||
|
@ -1738,6 +1758,138 @@ LogDoctor によって考慮されないフィールドは、「DISCARDED」と
|
|||
<source>Show the changelog</source>
|
||||
<translation type="unfinished">変更ログを表示する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Speed</source>
|
||||
<translation type="unfinished">スピード</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Represents a step in the time axis, in seconds.
|
||||
All the values falling inside the same interval will be merged and the mean value will be used.</source>
|
||||
<translation type="unfinished">時間軸のステップを秒単位で表します。
|
||||
同じ間隔内にあるすべての値が結合され、平均値が使用されます。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Time interval</source>
|
||||
<translation type="unfinished">時間間隔</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1</source>
|
||||
<translation type="unfinished">1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>2</source>
|
||||
<translation type="unfinished">2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3</source>
|
||||
<translation type="unfinished">3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>4</source>
|
||||
<translation type="unfinished">4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>5</source>
|
||||
<translation type="unfinished">5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>10</source>
|
||||
<translation type="unfinished">10</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>15</source>
|
||||
<translation type="unfinished">15</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>20</source>
|
||||
<translation type="unfinished">20</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>30</source>
|
||||
<translation type="unfinished">30</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>60</source>
|
||||
<translation type="unfinished">60</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>120</source>
|
||||
<translation type="unfinished">120</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>180</source>
|
||||
<translation type="unfinished">180</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>240</source>
|
||||
<translation type="unfinished">240</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>300</source>
|
||||
<translation type="unfinished">300</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>600</source>
|
||||
<translation type="unfinished">600</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>900</source>
|
||||
<translation type="unfinished">900</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1200</source>
|
||||
<translation type="unfinished">1200</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1800</source>
|
||||
<translation type="unfinished">1800</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3600</source>
|
||||
<translation type="unfinished">3600</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The format to use for the labels of the time axis.</source>
|
||||
<translation type="unfinished">時間軸のラベルに使用する形式。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Time format</source>
|
||||
<translation type="unfinished">時刻形式</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>hh:mm</source>
|
||||
<translation type="unfinished">hh:mm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>hh</source>
|
||||
<translation type="unfinished">hh</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The size of the pie</source>
|
||||
<translation type="unfinished">パイの大きさ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Pie size</source>
|
||||
<translation type="unfinished">パイのサイズ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The maximum number of slices that the pie will be composed of.
|
||||
Exceeding slices will be grouped into one comprehensive slice.</source>
|
||||
<translation type="unfinished">円を構成するスライスの最大数。
|
||||
超過したスライスは 1 つの包括的なスライスにグループ化されます。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum slices</source>
|
||||
<translation type="unfinished">最大スライス数</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relational</source>
|
||||
<translation type="unfinished">関連した</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Appearance</source>
|
||||
<translation type="unfinished">外観</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>RichText</name>
|
||||
|
@ -2039,5 +2191,9 @@ LogDoctor によって考慮されないフィールドは、「DISCARDED」と
|
|||
<source>Saturday</source>
|
||||
<translation type="unfinished">土曜日</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relational Count</source>
|
||||
<translation type="unfinished">リレーショナルカウント</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
|
|
@ -251,6 +251,26 @@
|
|||
<source>Redesigned configs section</source>
|
||||
<translation type="unfinished">Seção de configurações redesenhada</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Version 4</source>
|
||||
<translation type="unfinished">Versão 4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Stability improvements</source>
|
||||
<translation type="unfinished">Melhorias de estabilidade</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generating warnings dinamically</source>
|
||||
<translation type="unfinished">Geração dinâmica dos avisos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>New tool:</source>
|
||||
<translation type="unfinished">Nova ferramenta:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation type="unfinished">Registro de alterações</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Crapinfo</name>
|
||||
|
@ -1738,6 +1758,138 @@ Campos marcados como 'DISCARDED' analisados corretamente, mas o
|
|||
<source>Show the changelog</source>
|
||||
<translation type="unfinished">Mostrar o registro de alterações</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Speed</source>
|
||||
<translation type="unfinished">Velocidade</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Represents a step in the time axis, in seconds.
|
||||
All the values falling inside the same interval will be merged and the mean value will be used.</source>
|
||||
<translation type="unfinished">Representa uma etapa no eixo do tempo, em segundos.
|
||||
Todos os valores dentro do mesmo intervalo serão mesclados e o valor médio será usado.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Time interval</source>
|
||||
<translation type="unfinished">Intervalo de tempo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1</source>
|
||||
<translation>1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>2</source>
|
||||
<translation>2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3</source>
|
||||
<translation>3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>4</source>
|
||||
<translation>4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>5</source>
|
||||
<translation>5</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>10</source>
|
||||
<translation>10</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>15</source>
|
||||
<translation>15</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>20</source>
|
||||
<translation>20</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>30</source>
|
||||
<translation>30</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>60</source>
|
||||
<translation>60</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>120</source>
|
||||
<translation>120</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>180</source>
|
||||
<translation>180</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>240</source>
|
||||
<translation>240</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>300</source>
|
||||
<translation>300</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>600</source>
|
||||
<translation>600</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>900</source>
|
||||
<translation>900</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1200</source>
|
||||
<translation>1200</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1800</source>
|
||||
<translation>1800</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3600</source>
|
||||
<translation>3600</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The format to use for the labels of the time axis.</source>
|
||||
<translation type="unfinished">O formato a ser usado para os rótulos do eixo do tempo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Time format</source>
|
||||
<translation type="unfinished">Formato de hora</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>hh:mm</source>
|
||||
<translation type="unfinished">hh:mm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>hh</source>
|
||||
<translation type="unfinished">hh</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The size of the pie</source>
|
||||
<translation type="unfinished">O tamanho do gráfico de pizza</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Pie size</source>
|
||||
<translation type="unfinished">Tamanho da torta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The maximum number of slices that the pie will be composed of.
|
||||
Exceeding slices will be grouped into one comprehensive slice.</source>
|
||||
<translation type="unfinished">O número máximo de fatias que comporão a torta.
|
||||
As fatias excedentes serão agrupadas em uma fatia abrangente.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum slices</source>
|
||||
<translation type="unfinished">Número máximo de fatias</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relational</source>
|
||||
<translation type="unfinished">Relacional</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Appearance</source>
|
||||
<translation type="unfinished">Aparência</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>RichText</name>
|
||||
|
@ -2039,5 +2191,9 @@ Campos marcados como 'DISCARDED' analisados corretamente, mas o
|
|||
<source>Saturday</source>
|
||||
<translation>Sábado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relational Count</source>
|
||||
<translation type="unfinished">Contagem Relacional</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
|
|
@ -6,6 +6,19 @@
|
|||
#include <tuple>
|
||||
|
||||
|
||||
template <typename T>
|
||||
struct is_std_array : std::false_type {};
|
||||
|
||||
template <typename T, std::size_t N>
|
||||
struct is_std_array<std::array<T,N>> : std::true_type {};
|
||||
|
||||
template <typename T, std::size_t N>
|
||||
struct is_std_array<const std::array<T,N>> : std::true_type {};
|
||||
|
||||
template <typename A>
|
||||
concept IsStdArray = is_std_array<A>::value;
|
||||
|
||||
|
||||
template <typename Array>
|
||||
struct Zipperator
|
||||
{
|
||||
|
@ -87,12 +100,12 @@ public:
|
|||
|
||||
|
||||
template <typename Array>
|
||||
class EnumeratdArray
|
||||
class EnumeratedArray
|
||||
{
|
||||
const Array& arr;
|
||||
|
||||
public:
|
||||
explicit EnumeratdArray( const Array& a )
|
||||
explicit EnumeratedArray( const Array& a )
|
||||
: arr{a} {}
|
||||
|
||||
inline auto begin() noexcept
|
||||
|
@ -118,6 +131,7 @@ namespace ArrayOps
|
|||
\todo Replace with std::views::zip when clang will fully support it
|
||||
*/
|
||||
template <typename Array>
|
||||
requires IsStdArray<Array>
|
||||
inline auto zip( Array& l_array, Array& r_array )
|
||||
{
|
||||
return ZippedArrays<Array>( l_array, r_array );
|
||||
|
@ -131,9 +145,10 @@ inline auto zip( Array& l_array, Array& r_array )
|
|||
\todo Replace with std::views::enumerate when clang will fully support it
|
||||
*/
|
||||
template <typename Array>
|
||||
requires IsStdArray<Array>
|
||||
inline auto enumerate( const Array& array )
|
||||
{
|
||||
return EnumeratdArray<Array>( array );
|
||||
return EnumeratedArray<Array>( array );
|
||||
}
|
||||
|
||||
} // namespace ArrayOps
|
||||
|
|
|
@ -24,6 +24,9 @@
|
|||
#define CHUNK 16384
|
||||
|
||||
|
||||
namespace /*private*/
|
||||
{
|
||||
|
||||
//! RAII class to handle s file resource
|
||||
class FileHandler final
|
||||
{
|
||||
|
@ -73,6 +76,8 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
} //namespace (private)
|
||||
|
||||
|
||||
|
||||
namespace GZutils
|
||||
|
|
|
@ -10,6 +10,9 @@
|
|||
#include <fstream>
|
||||
|
||||
|
||||
namespace /*private*/
|
||||
{
|
||||
|
||||
//! RAII class to handle a file stream resource
|
||||
template<typename Stream>
|
||||
class FileHandler final
|
||||
|
@ -48,6 +51,8 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
} //namespace (private)
|
||||
|
||||
|
||||
|
||||
namespace IOutils
|
||||
|
|
|
@ -11,6 +11,9 @@
|
|||
#include <unordered_map>
|
||||
|
||||
|
||||
namespace /*private*/
|
||||
{
|
||||
|
||||
enum StyleId : uint32_t {
|
||||
TEXT_PRIMARY,
|
||||
TEXT_DISABLED,
|
||||
|
@ -92,8 +95,12 @@ enum StyleId : uint32_t {
|
|||
CONFIGS_TREE_BASE
|
||||
};
|
||||
|
||||
} //namespace (private)
|
||||
|
||||
|
||||
using StyleMap = std::unordered_map<StyleId, QString>;
|
||||
|
||||
|
||||
StyleMap makeStyleMap()
|
||||
{
|
||||
switch ( GlobalConfigs::window_theme ) {
|
||||
|
@ -582,58 +589,75 @@ QString getStyleSheet()
|
|||
" selection-background-color: "% style.at(BOXES_BASE_SELECTION) %";"
|
||||
"}"
|
||||
// spin boxes
|
||||
"QSpinBox {"
|
||||
"QSpinBox,"
|
||||
"QDoubleSpinBox {"
|
||||
" border-radius: 4px;"
|
||||
" color: "% style.at(LINEDIT_TEXT) %";"
|
||||
" background-color: "% style.at(LINEDIT_BASE) %";"
|
||||
" selection-color: "% style.at(LINEDIT_TEXT) %";"
|
||||
" selection-background-color: "% style.at(LINEDIT_BASE_SELECTION) %";"
|
||||
"}"
|
||||
"QSpinBox::focus {"
|
||||
"QSpinBox::focus,"
|
||||
"QDoubleSpinBox::focus {"
|
||||
" background-color: "% style.at(LINEDIT_BASE_FOCUS) %";"
|
||||
"}"
|
||||
"QSpinBox::disabled {"
|
||||
"QSpinBox::disabled,"
|
||||
"QDoubleSpinBox::disabled {"
|
||||
" border-color: "% style.at(BOXES_BASE_DISABLED) %";"
|
||||
" color: "% style.at(TEXT_DISABLED) %";"
|
||||
" background-color: "% style.at(BOXES_BASE_DISABLED) %";"
|
||||
"}"
|
||||
"QSpinBox::up-button,"
|
||||
"QSpinBox::down-button {"
|
||||
"QSpinBox::down-button,"
|
||||
"QDoubleSpinBox::up-button,"
|
||||
"QDoubleSpinBox::down-button {"
|
||||
" padding: 2px;"
|
||||
" border-left: 2px solid "% style.at(BOXES_DECO) %";"
|
||||
" background-color: "% style.at(BOXES_BASE_SECONDARY) %";"
|
||||
"}"
|
||||
"QSpinBox::up-button:hover,"
|
||||
"QSpinBox::down-button:hover {"
|
||||
"QSpinBox::down-button:hover,"
|
||||
"QDoubleSpinBox::up-button:hover,"
|
||||
"QDoubleSpinBox::down-button:hover {"
|
||||
" background-color: "% style.at(BOXES_BASE_SELECTION) %";"
|
||||
"}"
|
||||
"QSpinBox::up-button:off,"
|
||||
"QSpinBox::down-button:off {"
|
||||
"QSpinBox::down-button:off,"
|
||||
"QDoubleSpinBox::up-button:off,"
|
||||
"QDoubleSpinBox::down-button:off {"
|
||||
" background-color: "% style.at(BOXES_BASE_DISABLED) %";"
|
||||
"}"
|
||||
"QSpinBox::up-button:disabled,"
|
||||
"QSpinBox::down-button:disabled {"
|
||||
"QSpinBox::down-button:disabled,"
|
||||
"QDoubleSpinBox::up-button:disabled,"
|
||||
"QDoubleSpinBox::down-button:disabled {"
|
||||
" border-left-color: "% style.at(BOXES_BASE_PRIMARY) %";"
|
||||
" background-color: "% style.at(BOXES_BASE_DISABLED) %";"
|
||||
"}"
|
||||
"QSpinBox::up-arrow {"
|
||||
"QSpinBox::up-arrow,"
|
||||
"QDoubleSpinBox::up-arrow {"
|
||||
" width: 7px;"
|
||||
" height: 7px;"
|
||||
" padding: 2px;"
|
||||
" image: url(:/icons/icons/"% icons_theme %"/spinbox_add.png);"
|
||||
"}"
|
||||
"QSpinBox::up-arrow:off,"
|
||||
"QSpinBox::up-arrow:disabled {"
|
||||
"QSpinBox::up-arrow:disabled,"
|
||||
"QDoubleSpinBox::up-arrow:off,"
|
||||
"QDoubleSpinBox::up-arrow:disabled {"
|
||||
" image: url(:/icons/icons/midtone/spinbox_add.png);"
|
||||
"}"
|
||||
"QSpinBox::down-arrow {"
|
||||
"QSpinBox::down-arrow,"
|
||||
"QDoubleSpinBox::down-arrow {"
|
||||
" width: 7px;"
|
||||
" height: 7px;"
|
||||
" padding: 2px;"
|
||||
" image: url(:/icons/icons/"% icons_theme %"/spinbox_sub.png);"
|
||||
"}"
|
||||
"QSpinBox::down-arrow:off,"
|
||||
"QSpinBox::down-arrow:disabled {"
|
||||
"QSpinBox::down-arrow:disabled,"
|
||||
"QDoubleSpinBox::down-arrow:off,"
|
||||
"QDoubleSpinBox::down-arrow:disabled {"
|
||||
" image: url(:/icons/icons/midtone/spinbox_sub.png);"
|
||||
"}"
|
||||
// scroll bars
|
||||
|
|
|
@ -44,7 +44,7 @@ fi
|
|||
cd build
|
||||
|
||||
# Prepare the cmake files
|
||||
cmake ../logdoctor -DCMAKE_BUILD_TYPE=MinSizeRel
|
||||
cmake ../logdoctor -DCMAKE_BUILD_TYPE=Release
|
||||
if [[ "$?" != "0" ]]
|
||||
then
|
||||
# an error occured during preparation
|
||||
|
|
|
@ -44,7 +44,7 @@ fi
|
|||
cd build
|
||||
|
||||
# Prepare the cmake files
|
||||
cmake ../logdoctor -DCMAKE_BUILD_TYPE=MinSizeRel
|
||||
cmake ../logdoctor -DCMAKE_BUILD_TYPE=Release
|
||||
if [[ "$?" != "0" ]]
|
||||
then
|
||||
# an error occured during preparation
|
||||
|
|
|
@ -23,7 +23,7 @@ fi
|
|||
cd build
|
||||
|
||||
# Prepare the cmake files
|
||||
cmake ../logdoctor -DCMAKE_BUILD_TYPE=MinSizeRel
|
||||
cmake ../logdoctor -DCMAKE_BUILD_TYPE=Release
|
||||
if [[ "$?" != "0" ]]
|
||||
then
|
||||
# an error occured during preparation
|
||||
|
|
|
@ -44,7 +44,7 @@ fi
|
|||
cd build
|
||||
|
||||
# Prepare the cmake files
|
||||
cmake ../logdoctor -DCMAKE_BUILD_TYPE=MinSizeRel
|
||||
cmake ../logdoctor -DCMAKE_BUILD_TYPE=Release
|
||||
if [[ "$?" != "0" ]]
|
||||
then
|
||||
# an error occured during preparation
|
||||
|
|
|
@ -44,7 +44,7 @@ fi
|
|||
cd build
|
||||
|
||||
# Prepare the cmake files
|
||||
cmake ../logdoctor -DCMAKE_BUILD_TYPE=MinSizeRel
|
||||
cmake ../logdoctor -DCMAKE_BUILD_TYPE=Release
|
||||
if [[ "$?" != "0" ]]
|
||||
then
|
||||
# an error occured during preparation
|
||||
|
|
|
@ -44,7 +44,7 @@ fi
|
|||
mkdir build && cd build
|
||||
|
||||
# Prepare the cmake files
|
||||
cmake ../logdoctor -DCMAKE_BUILD_TYPE=MinSizeRel
|
||||
cmake ../logdoctor -DCMAKE_BUILD_TYPE=Release
|
||||
if [[ "$?" != "0" ]]
|
||||
then
|
||||
# an error occured during preparation
|
||||
|
|
|
@ -43,7 +43,7 @@ fi
|
|||
mkdir build && cd build
|
||||
|
||||
# Prepare the cmake files
|
||||
cmake ../logdoctor -DCMAKE_BUILD_TYPE=MinSizeRel
|
||||
cmake ../logdoctor -DCMAKE_BUILD_TYPE=Release
|
||||
if [[ "$?" != "0" ]]
|
||||
then
|
||||
# an error occured during preparation
|
||||
|
|
|
@ -420,7 +420,7 @@ IF ERRORLEVEL 1 (
|
|||
cd build
|
||||
|
||||
:: Prepare build files
|
||||
"%cmake_path%" "%logdocdir%/logdoctor" "-DCMAKE_BUILD_TYPE:STRING=MinSizeRel" "-DCMAKE_GENERATOR:STRING=NMake Makefiles JOM" "-DCMAKE_MAKE_PROGRAM:STRING=jom" "-DCMAKE_CXX_COMPILER:FILEPATH=%cxx_compiler%" "-DCMAKE_PREFIX_PATH:PATH=%prefix_path%" "-DQT_DIR:PATH=%qt_dir%"
|
||||
"%cmake_path%" "%logdocdir%/logdoctor" "-DCMAKE_BUILD_TYPE:STRING=Release" "-DCMAKE_GENERATOR:STRING=NMake Makefiles JOM" "-DCMAKE_MAKE_PROGRAM:STRING=jom" "-DCMAKE_CXX_COMPILER:FILEPATH=%cxx_compiler%" "-DCMAKE_PREFIX_PATH:PATH=%prefix_path%" "-DQT_DIR:PATH=%qt_dir%"
|
||||
IF ERRORLEVEL 1 (
|
||||
ECHO:
|
||||
ECHO Error: failed to prepare cmake files
|
||||
|
|