diff --git a/src/gui/components/Makefile.am b/src/gui/components/Makefile.am index 7cdd0f57d..d7a349356 100644 --- a/src/gui/components/Makefile.am +++ b/src/gui/components/Makefile.am @@ -31,6 +31,7 @@ libneutrino_gui_components_a_SOURCES = \ cc_frm_header.cpp \ cc_frm_ext_text.cpp \ cc_frm_icons.cpp \ + cc_frm_picture.cpp \ cc_frm_scrollbar.cpp \ cc_frm_signalbars.cpp \ cc_frm_slider.cpp \ diff --git a/src/gui/components/cc_frm_picture.cpp b/src/gui/components/cc_frm_picture.cpp new file mode 100644 index 000000000..1d2cee854 --- /dev/null +++ b/src/gui/components/cc_frm_picture.cpp @@ -0,0 +1,74 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Classes for generic GUI-related components. + 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 + Library 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 +#include +#include "cc_item_picture.h" + + +void CComponentsPicture::getRealSize(int *dx, int *dy) +{ + ccp->getRealSize(dx, dy); +} + +void CComponentsPicture::setPicture(const std::string &name, const int &w, const int &h) +{ + ccp->setPicture(name, w, h); + init(x, y, name, ccp->getBodyBGImageTranparencyMode()); +} + +void CComponentsPicture::setPicture(const char *name, const int &w, const int &h) +{ + setPicture(name, w, h); +} + +std::string CComponentsPicture::getPictureName() +{ + return ccp->getPictureName(); +} + +void CComponentsPicture::SetTransparent(const int &mode) +{ + init(x, y, ccp->getBodyBGImage(), mode); +} + +void CComponentsPicture::setWidth(const int &w, bool keep_aspect) +{ + ccp->setWidth(w, keep_aspect); + init(x, y, ccp->getBodyBGImage(), ccp->getBodyBGImageTranparencyMode()); +} + +void CComponentsPicture::setHeight(const int &h, bool keep_aspect) +{ + ccp->setHeight(h, keep_aspect); + init(x, y, ccp->getBodyBGImage(), ccp->getBodyBGImageTranparencyMode()); +} + +void CComponentsPicture::paint(const bool &do_save_bg) +{ + CComponentsForm::paint(do_save_bg); +}; diff --git a/src/gui/components/cc_item_picture.cpp b/src/gui/components/cc_item_picture.cpp index dd4ad80b8..e20faae9d 100644 --- a/src/gui/components/cc_item_picture.cpp +++ b/src/gui/components/cc_item_picture.cpp @@ -35,28 +35,33 @@ extern CPictureViewer *g_PicViewer; -CCPictureBase::CCPictureBase(const int &x_pos, - const int &y_pos, - const int &w, - const int &h, - const std::string &image, - CComponentsForm *parent, - int shadow_mode, - fb_pixel_t color_frame, - fb_pixel_t color_background, - fb_pixel_t color_shadow, - const int &transparency_mode) - : CComponentsShapeSquare(x_pos, y_pos, w, h, NULL, shadow_mode, color_frame, color_background, color_shadow) +// CCPicture + +CCPicture::CCPicture(const int &x_pos, + const int &y_pos, + const int &w, + const int &h, + const std::string &image, + CComponentsForm *parent, + int shadow_mode, + fb_pixel_t color_frame, + fb_pixel_t color_background, + fb_pixel_t color_shadow, + const int &transparency_mode) + : CComponentsShapeSquare(x_pos, y_pos, w, h, NULL, shadow_mode, color_frame, color_background, color_shadow) { cc_item_type.id = CC_ITEMTYPE_PICTURE; cc_item_type.name = image.empty() ? "cc_image_box" : image; cc_bg_image_tr_mode = transparency_mode; + // image and background are the same things in this object! Must be always enabled. + paint_bg = true; + setPicture(image, w, h); initParent(parent); } -void CCPictureBase::setPicture(const std::string &name, const int &w, const int &h) +void CCPicture::setPicture(const std::string &name, const int &w, const int &h) { setBodyBGImageName(name, "", ""); @@ -67,7 +72,7 @@ void CCPictureBase::setPicture(const std::string &name, const int &w, const int if (getBodyBGImage().empty()) { - dprintf(DEBUG_INFO, "[CCPictureBase] [%s - %d] no image defined or doesn't exists %s\n", __func__, __LINE__, name.c_str()); + dprintf(DEBUG_INFO, "[CCPicture] [%s - %d] no image defined or doesn't exists %s\n", __func__, __LINE__, name.c_str()); return; } @@ -96,7 +101,7 @@ void CCPictureBase::setPicture(const std::string &name, const int &w, const int CCDraw::setHeight(dy_tmp); } -void CCPictureBase::setPicture(const char *name, const int &w, const int &h) +void CCPicture::setPicture(const char *name, const int &w, const int &h) { std::string s_tmp = ""; if (name) @@ -104,35 +109,38 @@ void CCPictureBase::setPicture(const char *name, const int &w, const int &h) setPicture(s_tmp, w, h); } -void CCPictureBase::setWidth(const int &w, bool keep_aspect) +void CCPicture::setWidth(const int &w, bool keep_aspect) { setPicture(cc_bg_std_image, w, keep_aspect ? 0 : height); } -void CCPictureBase::setHeight(const int &h, bool keep_aspect) +void CCPicture::setHeight(const int &h, bool keep_aspect) { setPicture(cc_bg_std_image, keep_aspect ? 0 : width, h); } -void CCPictureBase::getRealSize(int *dx, int *dy) +void CCPicture::getRealSize(int *dx, int *dy) { *dx = dx_orig; *dy = dy_orig; } + +// CComponentsChannelLogo + CComponentsChannelLogo::CComponentsChannelLogo(const int &x_pos, - const int &y_pos, - const int &w, - const int &h, - const std::string &channelName, - const uint64_t &channelId, - CComponentsForm *parent, - int shadow_mode, - fb_pixel_t color_frame, - fb_pixel_t color_background, - fb_pixel_t color_shadow, - const int &transparency_mode) - : CCPictureBase(x_pos, y_pos, w, h, "", parent, shadow_mode, color_frame, color_background, color_shadow, transparency_mode) + const int &y_pos, + const int &w, + const int &h, + const std::string &channelName, + const uint64_t &channelId, + CComponentsForm *parent, + int shadow_mode, + fb_pixel_t color_frame, + fb_pixel_t color_background, + fb_pixel_t color_shadow, + const int &transparency_mode) + : CCPicture(x_pos, y_pos, w, h, "", parent, shadow_mode, color_frame, color_background, color_shadow, transparency_mode) { cc_item_type.id = CC_ITEMTYPE_CHANNEL_LOGO; cc_item_type.name = "cc_channel_logo_box"; diff --git a/src/gui/components/cc_item_picture.h b/src/gui/components/cc_item_picture.h index ab91204e7..25ee8f8e0 100644 --- a/src/gui/components/cc_item_picture.h +++ b/src/gui/components/cc_item_picture.h @@ -30,21 +30,22 @@ #endif #include "cc_base.h" +#include "cc_frm.h" #include "cc_item_shapes.h" #include -//! Sub class of CComponentsShapeSquare. Shows box with image with assigned attributes. +//! Shows box with image with assigned attributes. /*! -Picture is usable as an object like each other CCItems. +Usable as an object like each other CCItems. */ -class CCPictureBase : public CComponentsShapeSquare +class CCPicture : public CComponentsShapeSquare { private: int dx_orig, dy_orig; public: - CCPictureBase(const int &x_pos, + CCPicture(const int &x_pos, const int &y_pos, const int &w, const int &h, @@ -56,7 +57,7 @@ class CCPictureBase : public CComponentsShapeSquare fb_pixel_t color_shadow = COL_SHADOW_PLUS_0, const int &transparency_mode = CFrameBuffer::TM_EMPTY); - virtual~CCPictureBase() {}; + virtual~CCPicture() {}; ///sets an image name, full image path or url to an image file void setPicture(const std::string &name, const int &w = 0, const int &h = 0); @@ -77,51 +78,12 @@ class CCPictureBase : public CComponentsShapeSquare void getRealSize(int *dx, int *dy); }; -class CComponentsPicture : public CCPictureBase -{ - public: - /*! - Use this for non scaled images. - Dimensions are defined by image itself. - If scaling is required, you should use class CComponentsPicture with dimension parameters see next. - width and height are defined by give image dimensions itself and are retrievable e.g. with getWidth() or getHeight(). - */ - CComponentsPicture(const int &x_pos, - const int &y_pos, - const std::string &image, - CComponentsForm *parent = NULL, - int shadow_mode = CC_SHADOW_OFF, - fb_pixel_t color_frame = COL_FRAME_PLUS_0, - fb_pixel_t color_background = 0, - fb_pixel_t color_shadow = COL_SHADOW_PLUS_0, - int transparency_mode = CFrameBuffer::TM_EMPTY) - : CCPictureBase(x_pos, y_pos, 0, 0, image, parent, shadow_mode, color_frame, color_background, color_shadow, transparency_mode) {}; +//! Shows box with channel logo with assigned attributes. +/*! +Usable as an object like each other CCItems. +*/ - /*! - Use this for scaled images. - Dimensions are defined with parameters w (width) and h (height). - Only dimension values > 0 have a scale effect! - If one of the dimension parameters = 0, the ratio of image will be kept. - If scaling is not required, you should use overloaded class CComponentsPicture without dimension parameters or set values of w and h = 0. - width and height are retrievable e.g. with getWidth() or getHeight(). - */ - CComponentsPicture(const int &x_pos, - const int &y_pos, - const int &w, - const int &h, - const std::string &image, - CComponentsForm *parent = NULL, - int shadow_mode = CC_SHADOW_OFF, - fb_pixel_t color_frame = COL_FRAME_PLUS_0, - fb_pixel_t color_background = 0, - fb_pixel_t color_shadow = COL_SHADOW_PLUS_0, - int transparency_mode = CFrameBuffer::TM_EMPTY) - : CCPictureBase(x_pos, y_pos, w, h, image, parent, shadow_mode, color_frame, color_background, color_shadow, transparency_mode) {}; - - virtual~CComponentsPicture() {}; -}; - -class CComponentsChannelLogo : public CCPictureBase +class CComponentsChannelLogo : public CCPicture { private: ///channel id @@ -138,15 +100,13 @@ class CComponentsChannelLogo : public CCPictureBase ///indicates that logo is available, after paint or new instance, value = false bool has_logo; -// void init(const uint64_t& channelId, const std::string &channelName, bool allow_scale); - public: /*! Constructor for channel image objects: use this for scaled channel logos. Does the same like class CComponentsPicture() with parameters w (width) and h (height), see above! Requires parameter channel_name or channelId instead image filename NOTE: channel name string is prefered! - */ + */ CComponentsChannelLogo(const int &x_pos, const int &y_pos, const int &w, @@ -160,6 +120,24 @@ class CComponentsChannelLogo : public CCPictureBase fb_pixel_t color_shadow = COL_SHADOW_PLUS_0, const int &transparency_mode = CFrameBuffer::TM_EMPTY); + /*! + Constructor for channel image objects: use this for non scaled channel logos. + Does the same like class CComponentsPicture() without parameters w (width) and h (height), see above! + Requires parameter channel_name or channelId instead image filename + NOTE: channel name string is prefered! + */ + CComponentsChannelLogo(const int &x_pos, + const int &y_pos, + const std::string &channelName = "", + const uint64_t &channelId = 0, + CComponentsForm *parent = NULL, + int shadow_mode = CC_SHADOW_OFF, + fb_pixel_t color_frame = COL_FRAME_PLUS_0, + fb_pixel_t color_background = 0, + fb_pixel_t color_shadow = COL_SHADOW_PLUS_0, + const int &transparency_mode = CFrameBuffer::TM_EMPTY) + : CComponentsChannelLogo(x_pos, y_pos, 0, 0, channelName, channelId, parent, shadow_mode, color_frame, color_background, color_shadow, transparency_mode) {}; + virtual~CComponentsChannelLogo() {}; ///set channel id and/or channel name, NOTE: channel name is prefered @@ -179,23 +157,157 @@ class CComponentsChannelLogo : public CCPictureBase ///returns true, if any logo is available, also if an alternate logo was defined bool hasLogo() {return has_logo;} +}; + +class CComponentsPicture : public CComponentsForm +{ + private: + CCPicture *ccp; + + void init(const int &x_pos, const int &y_pos, const std::string &image, const int &transparency_mode) + { + setPos(x_pos, y_pos); + + if (ccp == NULL) + { + ccp = new CCPicture(0, 0, width, height, image, this, CC_SHADOW_OFF, COL_FRAME_PLUS_0, 0, COL_SHADOW_PLUS_0, transparency_mode); + } + else + { + ccp->setPicture(image, width, height); + ccp->SetTransparent(transparency_mode); + } + + CComponentsForm::setWidth(ccp->getWidth()); + CComponentsForm::setHeight(ccp->getHeight()); + }; + + public: /*! - Constructor for channel image objects: use this for non scaled channel logos. - Does the same like class CComponentsPicture() without parameters w (width) and h (height), see above! - Requires parameter channel_name or channelId instead image filename - NOTE: channel name string is prefered! + Use this for scaled images. + Dimensions are defined with parameters w (width) and h (height). + Only dimension values > 0 have a scale effect! + If one of the dimension parameters = 0, the ratio of image will be kept. + If scaling is not required, you should use overloaded class CComponentsPicture without dimension parameters or set values of w and h = 0. + width and height are retrievable e.g. with getWidth() or getHeight(). + + * @param[in] int x_pos, item position + * @param[in] int y_pos, item position + * @param[in] int w, item width + * @param[in] int h, item height + * @param[in] std::string image, image name, path or url + * @param[in] CComponentsForm *parent, parent form in which this item is embedded, optional, default NULL + * @param[in] int shadow_mode, mode of shadow, optional, default OFF + * @param[in] fb_pixel_t color_frame, color of frame, optional, default COL_FRAME_PLUS_0 + * @param[in] fb_pixel_t color_background, color of background, optional, default 0 + * @param[in] fb_pixel_t color_shadow, color of shadow, optional, default COL_SHADOW_PLUS_0 + * @param[in] int transparency_mode, mode of image, optional, default CFrameBuffer::TM_EMPTY */ - CComponentsChannelLogo(const int &x_pos, + CComponentsPicture(const int &x_pos, const int &y_pos, - const std::string &channelName = "", - const uint64_t &channelId = 0, + const int &w, + const int &h, + const std::string &image, CComponentsForm *parent = NULL, int shadow_mode = CC_SHADOW_OFF, fb_pixel_t color_frame = COL_FRAME_PLUS_0, fb_pixel_t color_background = 0, fb_pixel_t color_shadow = COL_SHADOW_PLUS_0, - const int &transparency_mode = CFrameBuffer::TM_EMPTY) - : CComponentsChannelLogo(x_pos, y_pos, 0, 0, channelName, channelId, parent, shadow_mode, color_frame, color_background, color_shadow, transparency_mode) {}; + int transparency_mode = CFrameBuffer::TM_EMPTY) + : CComponentsForm(x_pos, y_pos, w, h, parent, shadow_mode, color_frame, color_background, color_shadow) + { + cc_item_type.name = image.empty() ? "cc_image_frm" : image; + ccp = NULL; + paint_bg = false; + init(x_pos, y_pos, image, transparency_mode); + }; + + /*! + Use this for non scaled images. + Dimensions are defined by image itself. + If scaling is required, you should use class CComponentsPicture with dimension parameters see above. + width and height are defined by given image dimensions itself and are retrievable e.g. with getWidth() or getHeight(). + * @param[in] int x_pos, item position + * @param[in] int y_pos, item position + * @param[in] std::string image, image name, path or url + * @param[in] CComponentsForm *parent, parent form in which this item is embedded, optional, default NULL + * @param[in] int shadow_mode, mode of shadow, optional, default OFF + * @param[in] fb_pixel_t color_frame, color of frame, optional, default COL_FRAME_PLUS_0 + * @param[in] fb_pixel_t color_background, color of background, optional, default 0 + * @param[in] fb_pixel_t color_shadow, color of shadow, optional, default COL_SHADOW_PLUS_0 + * @param[in] int transparency_mode, mode of image, optional, default CFrameBuffer::TM_EMPTY + */ + CComponentsPicture(const int &x_pos, + const int &y_pos, + const std::string &image, + CComponentsForm *parent = NULL, + int shadow_mode = CC_SHADOW_OFF, + fb_pixel_t color_frame = COL_FRAME_PLUS_0, + fb_pixel_t color_background = 0, + fb_pixel_t color_shadow = COL_SHADOW_PLUS_0, + int transparency_mode = CFrameBuffer::TM_EMPTY) + : CComponentsPicture(x_pos, y_pos, 0, 0, image, parent, shadow_mode, color_frame, color_background, color_shadow, transparency_mode) + {}; + + virtual~CComponentsPicture() {}; + + /*! + Passing original image size, use this to get origin dimensions of embedded image. + * @param[in] *int pointer to image width + * @param[in] *int pointer to image height + */ + void getRealSize(int *dx, int *dy); + + /*! + Sets an image name, full image path or url to an image file. + Different dimension values > 0 will scale images, if is only one dimension value != 0, ratio will be kept. + * @param[in] std::string or const *char for image + * @param[in] int w image width, optional, default 0 + * @param[in] int h image height, optional, default 0 + */ + void setPicture(const std::string &name, const int &w = 0, const int &h = 0); + void setPicture(const char *name, const int &w = 0, const int &h = 0); + + /*! + * This will return the current image with full path + * + * @return std::string returns image path + */ + std::string getPictureName(); + + /*! + Sets image transparency mode + * @param[in] int mode + */ + void SetTransparent(const int &mode); + + /*! + Sets width of object, keep_aspect = true keeps ratio related to height + * @param[in] int w image width + * @param[in] bool keep_aspect, optional default = true + */ + void setWidth(const int &w, bool keep_aspect = true); + + /*! + Sets height of object, keep_aspect = true keeps ratio related to width + * @param[in] int h image width + * @param[in] bool keep_aspect, optional default = true + */ + void setHeight(const int &h, bool keep_aspect = true); + + /*! + Paints item + * @param[in] bool do_save_bg, optional default = true. True allows using hide() to restore background + * + * @see paintInit() + */ + void paint(const bool &do_save_bg = true); + + /**Enable/Disable paint caching for body and shadow + * @see CCDraw::enablePaintCache(), CCDraw::disablePaintCache() + */ + void enablePaintCache(const bool &enable = true) {ccp->enablePaintCache(enable); enablePaintCache(enable);} + void disablePaintCache(){enablePaintCache(false);} }; #endif //__CC_ITEM_PICTURE_V2_H__