commit ae07763abf25b897f6f17de57fadb210b87a81be Author: Pavel Sanda <sa...@lyx.org> Date: Fri Apr 5 19:34:29 2024 +0200
Allow relative statistics values in statusbar. https://www.mail-archive.com/lyx-devel@lists.lyx.org/msg221311.html --- lib/ui/stdcontext.inc | 2 ++ src/BufferView.cpp | 53 ++++++++++++++++++++++++++++++++++++++++++++ src/BufferView.h | 6 +++++ src/FuncCode.h | 1 + src/LyXAction.cpp | 10 +++++++++ src/frontends/qt/GuiView.cpp | 9 ++++---- 6 files changed, 77 insertions(+), 4 deletions(-) diff --git a/lib/ui/stdcontext.inc b/lib/ui/stdcontext.inc index dc49f44c77..679cc9e603 100644 --- a/lib/ui/stdcontext.inc +++ b/lib/ui/stdcontext.inc @@ -774,6 +774,8 @@ Menuset Item "Word Count|W" "ui-toggle statistics-w" Item "Character Count|C" "ui-toggle statistics-cb" Item "Character Count (No Blanks)|h" "ui-toggle statistics-c" + Item "Start Statistics Relative to Current Count|R" "statistics-reference-clamp" + OptItem "Reset to Absolute Statistics Count|A" "statistics-reference-clamp reset" End End diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 39fffed68e..7386c79a75 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -298,6 +298,12 @@ struct BufferView::Private frontend::CaretGeometry caret_geometry_; /// bool mouse_selecting_ = false; + /// Reference value for statistics (essentially subtract this from the actual value to see relative counts) + /// (words/chars/chars no blanks) + int stats_ref_value_w_ = 0; + int stats_ref_value_c_ = 0; + int stats_ref_value_nb_ = 0; + }; @@ -1337,6 +1343,17 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag) flag.setEnabled(cur.selection()); break; + case LFUN_STATISTICS_REFERENCE_CLAMP: { + // disable optitem reset if clamp not used + if (cmd.argument() == "reset" && d->stats_ref_value_c_ == 0) { + flag.setEnabled(false); + break; + } + flag.setEnabled(true); + break; + + } + default: return false; } @@ -2008,6 +2025,24 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) } break; + case LFUN_STATISTICS_REFERENCE_CLAMP: { + if (cmd.argument() == "reset") { + d->stats_ref_value_w_ = d->stats_ref_value_c_ = d->stats_ref_value_nb_ = 0; + break; + } + + DocIterator from, to; + from = doc_iterator_begin(&buffer_); + to = doc_iterator_end(&buffer_); + buffer_.updateStatistics(from, to); + + d->stats_ref_value_w_ = buffer_.wordCount(); + d->stats_ref_value_c_ = buffer_.charCount(true); + d->stats_ref_value_nb_ = buffer_.charCount(false); + break; + } + + case LFUN_SCREEN_UP: case LFUN_SCREEN_DOWN: { Point p = getPos(cur); @@ -2615,6 +2650,24 @@ bool BufferView::mouseSelecting() const } +int BufferView::stats_ref_value_w() const +{ + return d->stats_ref_value_w_; +} + + +int BufferView::stats_ref_value_c() const +{ + return d->stats_ref_value_c_; +} + + +int BufferView::stats_ref_value_nb() const +{ + return d->stats_ref_value_nb_; +} + + void BufferView::mouseEventDispatch(FuncRequest const & cmd0) { //lyxerr << "[ cmd0 " << cmd0 << "]" << endl; diff --git a/src/BufferView.h b/src/BufferView.h index b46ade3df5..eed48209bb 100644 --- a/src/BufferView.h +++ b/src/BufferView.h @@ -398,6 +398,12 @@ public: /// Are we currently performing a selection with the mouse? bool mouseSelecting() const; + /// Reference value for statistics (essentially subtract this from the actual value to see relative counts) + /// (words/chars/chars no blanks) + int stats_ref_value_w() const; + int stats_ref_value_c() const; + int stats_ref_value_nb() const; + private: /// noncopyable BufferView(BufferView const &); diff --git a/src/FuncCode.h b/src/FuncCode.h index 19f41295b1..a5f638d6d7 100644 --- a/src/FuncCode.h +++ b/src/FuncCode.h @@ -508,6 +508,7 @@ enum FuncCode LFUN_TAB_GROUP_NEXT, // daniel 20220130 LFUN_TAB_GROUP_PREVIOUS, // daniel 20220130 LFUN_BIBTEX_DATABASE_LIST, // bpiwowar, 20221218 + LFUN_STATISTICS_REFERENCE_CLAMP,// sanda, 20240324 LFUN_LASTACTION // end of the table }; diff --git a/src/LyXAction.cpp b/src/LyXAction.cpp index 19f12038a8..c20d647132 100644 --- a/src/LyXAction.cpp +++ b/src/LyXAction.cpp @@ -3923,6 +3923,16 @@ void LyXAction::init() * \endvar */ { LFUN_STATISTICS, "statistics", ReadOnly, System }, +/*! + * \var lyx::FuncCode lyx::LFUN_STATISTICS_REFERENCE_CLAMP + * \li Action: Count statistics relative to the current value. + In other words all future values will be subtracted by this value. + * \li Syntax: statistics-reference-clamp [reset] + * \li Params: reset: remove the clamp, i.e. count in the absolute numbers again + * \li Origin: sanda, Mar 28 2024 + * \endvar + */ + { LFUN_STATISTICS_REFERENCE_CLAMP, "statistics-reference-clamp", ReadOnly, System }, /*! * \var lyx::FuncCode lyx::LFUN_TABULAR_FEATURE diff --git a/src/frontends/qt/GuiView.cpp b/src/frontends/qt/GuiView.cpp index facdb81b67..ac0606e985 100644 --- a/src/frontends/qt/GuiView.cpp +++ b/src/frontends/qt/GuiView.cpp @@ -1481,7 +1481,7 @@ void GuiView::showStats() QStringList stats; if (word_count_enabled_) { - int const words = buf->wordCount(); + int const words = buf->wordCount() - bv->stats_ref_value_w(); if (words == 1) stats << toqstr(bformat(_("%1$d Word"), words)); else @@ -1489,13 +1489,14 @@ void GuiView::showStats() } int const chars_with_blanks = buf->charCount(true); if (char_count_enabled_) { + int const chars_with_blanks_disp = chars_with_blanks - bv->stats_ref_value_c(); if (chars_with_blanks == 1) - stats << toqstr(bformat(_("%1$d Character"), chars_with_blanks)); + stats << toqstr(bformat(_("%1$d Character"), chars_with_blanks_disp)); else - stats << toqstr(bformat(_("%1$d Characters"), chars_with_blanks)); + stats << toqstr(bformat(_("%1$d Characters"), chars_with_blanks_disp)); } if (char_nb_count_enabled_) { - int const chars = buf->charCount(false); + int const chars = buf->charCount(false) - bv->stats_ref_value_nb(); if (chars == 1) stats << toqstr(bformat(_("%1$d Character (no Blanks)"), chars)); else -- lyx-cvs mailing list lyx-cvs@lists.lyx.org http://lists.lyx.org/mailman/listinfo/lyx-cvs