From d738fc22c1df9729dc2840a19f655e17e5ce3923 Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Sat, 9 Oct 2021 01:23:28 +0200 Subject: [PATCH] gui/widget: add class CHourGlass Provides an hourglass/snake-loader function to visualize running processes. A template xcf-file for Gimp 2.10 is appended. Feel free to edit. Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/0e809c9c763ab63931877d3493be6f2b1ef2a298 Author: Thilo Graf Date: 2021-10-09 (Sat, 09 Oct 2021) --- configure.ac | 1 + data/icons/Makefile.am | 1 + data/icons/hourglass/Makefile.am | 10 ++ data/icons/hourglass/hourglass.xcf | Bin 0 -> 14727 bytes data/icons/hourglass/hourglass0.png | Bin 0 -> 2323 bytes data/icons/hourglass/hourglass1.png | Bin 0 -> 2502 bytes data/icons/hourglass/hourglass2.png | Bin 0 -> 2516 bytes data/icons/hourglass/hourglass3.png | Bin 0 -> 2461 bytes data/icons/hourglass/hourglass4.png | Bin 0 -> 2525 bytes data/icons/hourglass/hourglass5.png | Bin 0 -> 2462 bytes data/icons/hourglass/hourglass6.png | Bin 0 -> 2467 bytes src/gui/test_menu.cpp | 20 +++- src/gui/widget/Makefile.am | 1 + src/gui/widget/hintbox.cpp | 42 +++++---- src/gui/widget/hintbox.h | 4 +- src/gui/widget/hourglass.cpp | 138 +++++++++++++++++++++++++++ src/gui/widget/hourglass.h | 140 ++++++++++++++++++++++++++++ 17 files changed, 337 insertions(+), 20 deletions(-) create mode 100644 data/icons/hourglass/Makefile.am create mode 100644 data/icons/hourglass/hourglass.xcf create mode 100644 data/icons/hourglass/hourglass0.png create mode 100644 data/icons/hourglass/hourglass1.png create mode 100644 data/icons/hourglass/hourglass2.png create mode 100644 data/icons/hourglass/hourglass3.png create mode 100644 data/icons/hourglass/hourglass4.png create mode 100644 data/icons/hourglass/hourglass5.png create mode 100644 data/icons/hourglass/hourglass6.png create mode 100644 src/gui/widget/hourglass.cpp create mode 100644 src/gui/widget/hourglass.h diff --git a/configure.ac b/configure.ac index ccab584ab..645f97031 100644 --- a/configure.ac +++ b/configure.ac @@ -395,6 +395,7 @@ data/icons/buttons/Makefile data/icons/filetypes/Makefile data/icons/headers/Makefile data/icons/hints/Makefile +data/icons/hourglass/Makefile data/icons/locale/Makefile data/icons/movieplayer/Makefile data/icons/radar/Makefile diff --git a/data/icons/Makefile.am b/data/icons/Makefile.am index b73f283c1..31cbfe22c 100644 --- a/data/icons/Makefile.am +++ b/data/icons/Makefile.am @@ -3,6 +3,7 @@ SUBDIRS = \ filetypes \ headers \ hints \ + hourglass \ locale \ movieplayer \ radar \ diff --git a/data/icons/hourglass/Makefile.am b/data/icons/hourglass/Makefile.am new file mode 100644 index 000000000..776de78d1 --- /dev/null +++ b/data/icons/hourglass/Makefile.am @@ -0,0 +1,10 @@ +installdir = $(ICONSDIR) + +install_DATA = \ + hourglass0.png \ + hourglass1.png \ + hourglass2.png \ + hourglass3.png \ + hourglass4.png \ + hourglass5.png \ + hourglass6.png diff --git a/data/icons/hourglass/hourglass.xcf b/data/icons/hourglass/hourglass.xcf new file mode 100644 index 0000000000000000000000000000000000000000..bb12c12e853fb498b6b8c5d69944218c792addac GIT binary patch literal 14727 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 literal 0 HcmV?d00001 diff --git a/data/icons/hourglass/hourglass1.png b/data/icons/hourglass/hourglass1.png new file mode 100644 index 0000000000000000000000000000000000000000..ef5adaad6c0b37eec904e595f775fe48fcd78348 GIT binary patch literal 2502 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 QmjD0&07*qoM6N<$f?R2-1poj5 literal 0 HcmV?d00001 diff --git a/data/icons/hourglass/hourglass2.png b/data/icons/hourglass/hourglass2.png new file mode 100644 index 0000000000000000000000000000000000000000..e747b42affb11136a13229cba0319ea4960e7972 GIT binary patch literal 2516 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 literal 0 HcmV?d00001 diff --git a/data/icons/hourglass/hourglass6.png b/data/icons/hourglass/hourglass6.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8fd7775b79164805ad04e467630686fdc575ef GIT binary patch literal 2467 zcmV;U30(GxP)EX>4Tx04R}tkv&MmKpe$iTcxE`1kE7gkfAzR5EXHh zDi*;)X)CnqU~=gfG-*guTpR`0f`cE6RR0!X5l%$?&0I>U5saWpZjz4 zDFu@OK9P8i>4rtTK|Hf*>74h81y+_6;&bA0gDyz?$aUG}H_j!8{XA1JvgvtZfmkec zvE0S1Y^cQ3#8E}nDBquRS>e3JS*_Mt`=0!Tk%G38;X2I`B(Q`eQV=1djtZ)<5TjKi z#YCF+;~xHD$DbmXOs)zTITlcZ3d!+<|H1EW&EnLgn-qxyy)U-?F$x5CfmXw|zmILZ zbpiyQfh(=!uQh?$PtqG5EqVm>Zvz+C9ZlW?E_Z;TCtWfmM+(sN7mL9A8GTb87`z3- zYi@7teVjf3S?X%}1~@nb#!8gE?(yzWcW?imY4`U7Hp_C4vawi>00006VoOIv00000 z008+zyMF)x010qNS#tmYE+YT{E+YYWr9XB6000McNlirue zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00(PHL_t(&-o@HYaFyj12k_s$ zLcBL5LIMOZF(!&tK#DS8ODWXKsw`UBw2q6mZV~GbwmAX_u>0m*$kzrKD=w6e!Ow(yr38rdRm8EK09xPRVyu@>oh94kgUU z{4?pU$w-!)gzyh&^bx0I1qIUMR(jHx6>JJ%T!5?M@2k*^YiCRWDB?+y%PBGMvTn0N zn>7kHXN1pT1cPDVf1;~$QCB$C8#sUtoQePH!hY+p72Cs>lNklHk24sGS4{*pUrB%!AnLY(_ zd%_a0OycC7*^Hf0z=K-UyCINeUZxB?6k)l~>jt%vJ23r#lRHofR-#Ckk9MuF6b z`>YJCC`NP) zXR{V83g1uR`zLS=r#&}ysGO1&hDpz3qmB4F){Mh7y9R8FYqw%@a+>g$2iXH){UF3B;XCz~RTt?%I&B$Dh zIx8~5XT4-Tu68buQ@S!RRqoU3Dg|BZ94gSNkU_{4b2#EN=Tu(NF)0uy8|gJzK_zj| z%~+=xvJ^4^Q%1?p9L?)-&_MXqNG4fSSLW6^RA8%RQQ~BCRDTqjLq5u5zvJi*)1-i@ zq~k*yMXLtgghu~%0~dI^_!aC_dDOmof_EKE(^(!apJwQilIrgH4v=3DOM0YFdXUe8p00f?Sv% zvJ6I5b{M=6GGCIQpVh0|k?44aGwkF|xE1T&si#)kj4XO(v)4y?4 zH=Z4bR>>W5Ub}a2Bv5H2;HwU|V-wc9yVSEzH?gJNDtEgLYXdsVuG1YW|3134lRGpq zwRoFtz7eZlo1s`v2f=k9XqG-tmz4Pe)M5!79<|9*x5h%%h3k}=k&o~)j@hHfx3kpZ z<;mTfHThQbqgiJ9Y!F=sgKjx%f2rx80=ZjozXluK5pi}?rUok$3y1LNcv1tBJO@dypw$*^`nk}{@VEV=Yi(lGzR8yssCd@UYdlS%2rVcwI`_f}c^i>g@RpWGkL*bT3 z@K=27xKI7;N}GJSNe10r7WuK|wz)kl(HgE$%veN5pYg_)`X z6-8DBKYyRKYAti|)sAa2-P8OrefDP&+yjxAx&nqzqeEY*Jn(EbNzIS~6-63xkAfZQ zY_>20yf&l6a0Km02%JKJ #include #include @@ -1119,8 +1120,19 @@ int CTestMenu::exec(CMenuTarget* parent, const std::string &actionKey) showRecords(); return res; } - - + else if (actionKey == "hourglass"){ + CHourGlass hg(20, 20); + hg.paint(); + sleep(10); + hg.hide(); + return res; + } + else if (actionKey == "hourglass_proc"){ + CHourGlassProc proc(20, 20, sigc::mem_fun(*this, &CTestMenu::showRecords)); + proc.exec(); + return res; + } + return showTestMenu(); } @@ -1250,6 +1262,10 @@ int CTestMenu::showTestMenu() CKeyboardInput input("Text input", &input_txt, 30, NULL, NULL, "Test"); w_test.addItem(new CMenuForwarder("Text input", true, NULL, &input)); + //hourglass + w_test.addItem(new CMenuForwarder("Hourglass", true, NULL, this, "hourglass")); + w_test.addItem(new CMenuForwarder("Exec process with hourglass!", true, NULL, this, "hourglass_proc")); + //rate banner w_test.addItem(new CMenuForwarder("Rate banner", true, NULL, this, "rate_banner")); diff --git a/src/gui/widget/Makefile.am b/src/gui/widget/Makefile.am index 3c0e896c9..06359a47d 100644 --- a/src/gui/widget/Makefile.am +++ b/src/gui/widget/Makefile.am @@ -22,6 +22,7 @@ libneutrino_gui_widget_a_SOURCES = \ colorchooser.cpp \ helpbox.cpp \ hintbox.cpp \ + hourglass.cpp \ keychooser.cpp \ keyboard_input.cpp \ listbox.cpp \ diff --git a/src/gui/widget/hintbox.cpp b/src/gui/widget/hintbox.cpp index 88dce77a0..d64b3259b 100644 --- a/src/gui/widget/hintbox.cpp +++ b/src/gui/widget/hintbox.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #define MSG_FONT g_Font[SNeutrinoSettings::FONT_TYPE_MESSAGE_TEXT] @@ -495,9 +496,34 @@ int ShowHintS(const char * const Text, int timeout, bool show_background) { int res = messages_return::none; CHint hint(Text, show_background); + CHourGlass hg(CFrameBuffer::getInstance()->getScreenX() + OFFSET_INNER_MID, CFrameBuffer::getInstance()->getScreenY()); hint.setTimeOut(timeout, false); + hint.paint(); + hg.paint(); res = hint.exec(); + hg.hide(); + hint.hide(); + + return res; +} + +int ShowHintS(const char * const Text, const sigc::slot &Slot, int timeout, bool show_background) +{ + int res = messages_return::none; + + sigc::signal OnCall; + OnCall.connect(Slot); + + CHint hint(Text, show_background); + CHourGlass hg(CFrameBuffer::getInstance()->getScreenX() + OFFSET_INNER_MID, CFrameBuffer::getInstance()->getScreenY()); + hint.setTimeOut(timeout, false); + + hint.paint(); + hg.paint(); + OnCall(); + res = hint.exec(); + hg.hide(); hint.hide(); return res; @@ -513,22 +539,6 @@ int ShowHintS(const std::string& Text, int timeout, bool show_background) return ShowHintS(Text.c_str(), timeout, show_background); } -int ShowHintS(const char * const Text, const sigc::slot &Slot, int timeout, bool show_background) -{ - int res = messages_return::none; - - sigc::signal OnCall; - OnCall.connect(Slot); - CHint hint(Text, show_background); - hint.setTimeOut(timeout, false); - hint.paint(); - OnCall(); - res = hint.exec(); - hint.hide(); - - return res; -} - int ShowHintS(const neutrino_locale_t Text, const sigc::slot &Slot, int timeout, bool show_background) { return ShowHintS(g_Locale->getText(Text), Slot, timeout, show_background); diff --git a/src/gui/widget/hintbox.h b/src/gui/widget/hintbox.h index d5a84a522..793b8f982 100644 --- a/src/gui/widget/hintbox.h +++ b/src/gui/widget/hintbox.h @@ -434,10 +434,10 @@ int ShowHintS(const std::string &Text, int timeout = HINTBOX_DEFAULT_TIMEOUT, bo * @li expects sigc::slot * @li example: * @li sigc::slot sl = sigc::mem_fun(g_Plugins, &CPlugins::loadPlugins);\n - * ShowHintS(LOCALE_SERVICEMENU_GETPLUGINS_HINT, 1, true, &sl); + * ShowHintS(LOCALE_SERVICEMENU_GETPLUGINS_HINT, sl, 1); * @li or use a function with parameter(s): * sigc::slot sl = sigc::bind(sigc::mem_fun(*this, &CMyClass::foo), arg1, arg2, arg3, arg4);\n - * ShowHintS(LOCALE_SERVICEMENU_GETPLUGINS_HINT, 1, true, &sl); + * ShowHintS(LOCALE_SERVICEMENU_GETPLUGINS_HINT, sl, 1); * @param[in] timeout * @li optional: expects type int as seconds, default = HINTBOX_DEFAULT_TIMEOUT (get from settings) * @param[in] show_background diff --git a/src/gui/widget/hourglass.cpp b/src/gui/widget/hourglass.cpp new file mode 100644 index 000000000..f17d9c637 --- /dev/null +++ b/src/gui/widget/hourglass.cpp @@ -0,0 +1,138 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Hourglass, provides an hourglass/snakeloader function to visualize running processes. + Copyright (C) 2021, Thilo Graf 'dbt' + + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "hourglass.h" + +#include + +#include +#include +#include + +#define MAX_IMAGES 24 + +CHourGlass::CHourGlass( const int x_pos, + const int y_pos, + const int w, + const int h, + const std::string& image_basename, + const int64_t& interval, + CComponentsForm *parent, + int shadow_mode, + fb_pixel_t color_frame, + fb_pixel_t color_body, + fb_pixel_t color_shadow) : CComponentsShapeSquare(x_pos, y_pos, w, h, parent, shadow_mode, color_frame, color_body, color_shadow) +{ + cc_item_type.name ="wg_hourglass"; + + hg_image_basename = image_basename; + cc_bg_image = cc_bg_image_old = cc_bg_sel_image = cc_bg_sec_image = ""; + + initImageFiles(); + + hg_file_num = 0; + hg_interval = interval; + hg_timer = new CComponentsTimer(hg_interval); + hg_timer->OnTimer.connect(sigc::bind(sigc::mem_fun(*this, &CHourGlass::paint), true)); +} + +CHourGlass::~CHourGlass() +{ + delete hg_timer; + hg_timer = NULL; +} + +void CHourGlass::initImageFiles() +{ + std::string path = ""; + std::string filename = ""; + hg_img_files.clear(); + + for(int i = 0; i <= MAX_IMAGES; i++) + { + filename = hg_image_basename; + filename += to_string(i); + path = frameBuffer->getIconPath(filename, "png"); + if (file_exists(path)) + hg_img_files.push_back(filename); + else + continue; + } +} + +void CHourGlass::paint(const bool &do_save_bg) +{ + if (hg_img_files.empty()) + return; + + if (hg_file_num > hg_img_files.size()-1) + hg_file_num = 0; + + cc_bg_image = frameBuffer->getIconPath(hg_img_files.at(hg_file_num), "png"); + + hide(); + + if (!hg_timer->isRun()) + hg_timer->startTimer(); + else + paintInit(do_save_bg); + + hg_file_num ++; +} + + +CHourGlassProc::CHourGlassProc( const int x_pos, + const int y_pos, + const sigc::slot &Slot, + const int w, + const int h, + const std::string& image_basename, + const int64_t& interval, + CComponentsForm *parent, + int shadow_mode, + fb_pixel_t color_frame, + fb_pixel_t color_body, + fb_pixel_t color_shadow) : CHourGlass(x_pos, y_pos, w, h, image_basename, interval, parent, shadow_mode, color_frame, color_body, color_shadow) +{ + cc_item_type.name ="wg_hourglass_proc"; + + OnRun.connect(Slot); +} + +void CHourGlassProc::paint(const bool &do_save_bg) +{ + CHourGlass::paint(do_save_bg); +} + +int CHourGlassProc::exec() +{ + paint(true); + OnRun(); + hide(); + + return messages_return::handled; +} diff --git a/src/gui/widget/hourglass.h b/src/gui/widget/hourglass.h new file mode 100644 index 000000000..cf5a9c226 --- /dev/null +++ b/src/gui/widget/hourglass.h @@ -0,0 +1,140 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Hourglass, provides an hourglass/snakeloader function to visualize running processes. + Copyright (C) 2021, Thilo Graf 'dbt' + + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + + +#ifndef __HOURGLASS_H__ +#define __HOURGLASS_H__ + +#include +#include + +//! CHourglass shows a small image chain with timed order to visualize running processes or breaks. +/*! + CHourglass shows only a timer controlled image chain, CHourglassProc will run an additional process. + */ + +class CHourGlass : public CComponentsShapeSquare +{ + private: + std::string hg_image_basename; + std::vector hg_img_files; + int64_t hg_interval; + CComponentsTimer* hg_timer; + size_t hg_file_num; + + void initImageFiles(); + public: + /**CHourGlass Constructor + * @param[in] x_pos + * @li expects type int, x position on screen + * @param[in] y_pos + * @li expects type int, y position on screen + * @param[in] w + * @li optional: expects type int, defines box width, default value = 48 + * @param[in] h + * @li optional: expects type int, defines box height, default value = 48 + * @param[in] image_basename + * @li optional: expects type std::string, basename as name template for the image set, default = "hourglass" + * The images should have the png, format recommended dimensions are 48x48px, respectively the same values for width and height (see: arguments w and h), + * Different dimensions than arguments cause scaling. + * Filenames must have a digit suffix e.g: 0.png ... 3.png + * The max count of images are defined in MAX_IMAGES. + * Images must be stored as usual inside the defined icon directories. + * @param[in] interval + * @li optional: expects type int64_t, defines paint interval, default = 84ms + * @param[in] parent + * @li optional: expects type CComponentsForm, as a parent container in which this object is embedded, default = NULL (stand alone) + * @param[in] shadow_mode + * @li optional: expects type int, defines the shadow mode of object, default = CC_SHADOW_OFF (no shadow) + * @param[in] color_frame + * @li optional: expects type int, defines the frame color of object, default = COL_FRAME_PLUS_0 + * @param[in] color_body + * @li optional: expects type int, defines the body color of object, default = COL_MENUCONTENT_PLUS_0 + * NOTE: body background is already defined with the image_basename, pure body will only paint if no image is available. + * @param[in] color_shadow + * @li optional: expects type int, defines the shadow color of object, default = COL_SHADOW_PLUS_0 + + * @see class CComponentsShapeSquare() + */ + CHourGlass( const int x_pos, + const int y_pos, + const int w = 48, + const int h = 48, + const std::string& image_basename = "hourglass", + const int64_t& interval = 84, + CComponentsForm *parent = NULL, + int shadow_mode = CC_SHADOW_OFF, + fb_pixel_t color_frame = COL_FRAME_PLUS_0, + fb_pixel_t color_body = COL_MENUCONTENT_PLUS_0, + fb_pixel_t color_shadow = COL_SHADOW_PLUS_0); + + virtual ~CHourGlass(); + + void paint(const bool &do_save_bg = CC_SAVE_SCREEN_YES); +}; + +class CHourGlassProc : public CHourGlass +{ + private: + sigc::signal OnRun; + + public: + /**CHourGlassProc Constructor + * @see CHourGlass() for other parameters + * @li CHourGlassProc() have only one additional parameter, see as follows: + * @param[in] Slot + * @li expects sigc::slot + * @li example: + * @li sigc::slot sl = sigc::mem_fun(g_Plugins, &CPlugins::loadPlugins);\n + * CHourGlassProc proc(20, 20, sl); + * int ret = proc.exec(); + * @li or use a function with parameter(s): + * sigc::slot sl = sigc::bind(sigc::mem_fun(*this, &CMyClass::foo), arg1, arg2, arg3, arg4);\n + * CHourGlassProc proc(20, 20, sl); + * int ret = proc.exec(); + * @see CTestMenu for more examples. + * + * @see class CComponentsShapeSquare(), CHourGlass() + */ + CHourGlassProc( const int x_pos, + const int y_pos, + const sigc::slot &Slot, + const int w = 48, + const int h = 48, + const std::string& image_basename = "hourglass", + const int64_t& interval = 84, + CComponentsForm *parent = NULL, + int shadow_mode = CC_SHADOW_OFF, + fb_pixel_t color_frame = COL_FRAME_PLUS_0, + fb_pixel_t color_body = COL_MENUCONTENT_PLUS_0, + fb_pixel_t color_shadow = COL_SHADOW_PLUS_0); + + virtual ~CHourGlassProc(){}; + + void paint(const bool &do_save_bg = CC_SAVE_SCREEN_YES); + + /// paint and execute process at once, return value = messages_return::handled + int exec(); +}; + +#endif //__HOURGLASS_H__