/*
Based up Neutrino-GUI - Tuxbox-Project
Copyright (C) 2001 by Steffen Hehn 'McClean'
Classes for generic GUI-related components.
Copyright (C) 2012, 2013, 2014, 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 __CC_FORM_H__
#define __CC_FORM_H__
#include "config.h"
#include "cc_base.h"
#include "cc_item.h"
#include
#define DEFAULT_SEL_FRAME_WIDTH 1
class CComponentsForm : public CComponentsItem
{
protected:
std::vector v_cc_items;
void paintForm(const bool &do_save_bg);
///generates next possible index for an item, see also cc_item_index, getIndex(), setIndex()
int genIndex();
///scrollbar object
CComponentsScrollBar *sb;
std::mutex cc_frm_mutex;
int append_x_offset;
int append_y_offset;
///property: count of pages of form
uint8_t page_count;
///property: id of current page, default = 0 for 1st page
uint8_t cur_page;
///scrollbar width
int w_sb;
///returns true, if current page is changed, see also: setCurrentPage()
bool isPageChanged();
///enable/disable page scrolling, default enabled with page scroll mode up/down keys, see also enablePageScroll()
int page_scroll_mode;
///container for exit keys, default exit keys are CRCInput::RC_home and CRCInput::RC_setup
std::vector v_exit_keys;
///initialize basic properties
void Init( const int& x_pos, const int& y_pos, const int& w, const int& h,
const fb_pixel_t& color_frame,
const fb_pixel_t& color_body,
const fb_pixel_t& color_shadow);
public:
CComponentsForm( const int x_pos = 0, const int y_pos = 0, const int w = 800, const int h = 600,
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 ~CComponentsForm();
///paints current form on screen, for paint a page use paintPage()
void paint(const bool &do_save_bg = CC_SAVE_SCREEN_YES);
///same like CComponentsItem::kill(), but erases all embedded items inside of parent at once, this = parent
///NOTE: Items always have parent bindings to "this" and use the parent background color as default! Set parameter 'ignore_parent=true' to ignore parent background color!
void killCCItems(const fb_pixel_t& bg_color, bool ignore_parent);
/**
Removes possible contained items and finally removes
current form from screen and
restores last displayed background before form was painted.
*/
void hide(){hideCCItems(); CCDraw::hide();}
///restore background for all items inside form,
void hideCCItems();
///add an item to form collection, returns id
int addCCItem(CComponentsItem* cc_Item);
///add items from a vector to form collection, returns size/count of items
int addCCItem(const std::vector &cc_items);
void insertCCItem(const uint& cc_item_id, CComponentsItem* cc_Item);
/**Function to remove item from item collection and deallocates instance.
* @param[in] cc_item_id
* @li item id as unsigned int
*/
void removeCCItem(const uint& cc_item_id);
/**Function to remove item from item collection and deallocates instance.
* @param[in] cc_Item
* @li CComponentsItem*
*/
void removeCCItem(CComponentsItem* cc_Item);
/**Function to remove item from item collection and deallocates instance.
* @param[in] item_name
* @li std::string
* NOTE: Requires that unique names are assigned!
* @see
* getItemName()
*/
void removeCCItem(const std::string &item_name);
void replaceCCItem(const uint& cc_item_id, CComponentsItem* new_cc_Item);
void replaceCCItem(CComponentsItem* old_cc_Item, CComponentsItem* new_cc_Item);
void exchangeCCItem(const uint& item_id_a, const uint& item_id_b);
void exchangeCCItem(CComponentsItem* item_a, CComponentsItem* item_b);
/**Function to get current item id from passed item.
* @param[in] cc_Item
* @li CComponentsItem*
* @return
* int, in case of not found item returns -1
*/
int getCCItemId(CComponentsItem* cc_Item) const;
/**Function to get current item id from passed item name.
* @param[in] item_name
* @li std::string
* @return
* int, in case of not found item returns -1
* NOTE: Requires that unique names are assigned!
* @see
* setItemName()
* getItemName()
*/
int getCCItemId(const std::string &item_name) const;
/**Function to get current item from item collection.
* @param[in] cc_item_id
* @li item id as unsigned int
* @return
* CComponentsItem*, in case of not found item returns NULL
*/
CComponentsItem* getCCItem(const uint& cc_item_id) const;
/**Function to get previous item from item collection.
* @param[in] current_cc_item
* @li CComponentsItem*
* @return
* CComponentsItem*, in case of not found item returns NULL
*/
CComponentsItem* getPrevCCItem(CComponentsItem* current_cc_item) const;
/**Function to get next item from item collection.
* @param[in] current_cc_item
* @li CComponentsItem*
* @return
* CComponentsItem*, in case of not found item returns NULL
*/
CComponentsItem* getNextCCItem(CComponentsItem* current_cc_item) const;
void paintCCItems();
///clean up and deallocate existant items from v_cc_items at once
void clear();
///return true, if no items available
bool empty() const {return v_cc_items.empty();}
///return size (count) of available items
size_t size() const {return v_cc_items.size();}
///return reference to first item
CComponentsItem* front() const {return v_cc_items.front();}
///return reference to last item
CComponentsItem* back() const {return v_cc_items.back();}
///sets alignment offset between items
void setAppendOffset(const int &x_offset, const int& y_offset){append_x_offset = x_offset; append_y_offset = y_offset;};
///sets count of pages, parameter as uint8_t
///NOTE: page numbers are primary defined in items and this values have priority!! Consider that smaller values
///than the current values can make problems and are not allowed, therefore smaller values than
///current page count are ignored!
void setPageCount(const uint8_t& pageCount);
///returns current count of pages,
///NOTE: page number are primary defined in items and secondary in form variable 'page_count'. This function returns the maximal value from both!
uint8_t getPageCount();
///sets current page
void setCurrentPage(const uint8_t& current_page){cur_page = current_page;};
///get current page
uint8_t getCurrentPage() const {return cur_page;}
///paint defined page number 0...n
void paintPage(const uint8_t& page_number, const bool &do_save_bg = CC_SAVE_SCREEN_NO);
///enum page scroll modes
enum
{
PG_SCROLL_M_UP_DOWN_KEY = 1,
PG_SCROLL_M_LEFT_RIGHT_KEY = 2,
PG_SCROLL_M_OFF = 4
};
///enable/disable page scroll, parameter1 default enabled for up/down keys
void enablePageScroll(const int& mode = PG_SCROLL_M_UP_DOWN_KEY){page_scroll_mode = mode;};
///set width of scrollbar
void setScrollBarWidth(const int& scrollbar_width){w_sb = scrollbar_width;};
///returns id of selected item, return value as int, returns -1: if is nothing selected
int getSelectedItem() const;
/**Function to get consumed space of items inside form in y direction.
* @return
* int, used lines
*/
int getUsedDY() const;
/**Function to get consumed space of items inside form in x direction.
* @return
* int, used lines
*/
int getUsedDX() const;
/**Function to get free usable space of items inside form in y direction.
* @return
* int, free lines
*/
int getFreeDY() const {return height - getUsedDY();}
/**Function to get free usable space of items inside form in x direction.
* @return
* int, free lines
*/
int getFreeDX() const {return width - getUsedDX();}
///returns pointer to selected item, return value as CComponentsItem*, returns NULL: if is nothing selected
CComponentsItem* getSelectedItemObject() const;
///select a definied item, parameter1 as size_t
void setSelectedItem( int item_id,
const fb_pixel_t& sel_frame_col = COL_MENUCONTENTSELECTED_PLUS_0,
const fb_pixel_t& frame_col = COL_FRAME_PLUS_0,
const fb_pixel_t& sel_body_col = COL_MENUCONTENT_PLUS_0,
const fb_pixel_t& body_col = COL_MENUCONTENT_PLUS_0,
const int& frame_w = DEFAULT_SEL_FRAME_WIDTH,
const int& sel_frame_w = DEFAULT_SEL_FRAME_WIDTH);
///select a definied item, parameter1 as CComponentsItem*
void setSelectedItem( CComponentsItem* cc_item,
const fb_pixel_t& sel_frame_col = COL_MENUCONTENTSELECTED_PLUS_0,
const fb_pixel_t& frame_col = COL_FRAME_PLUS_0,
const fb_pixel_t& sel_body_col = COL_MENUCONTENT_PLUS_0,
const fb_pixel_t& body_col = COL_MENUCONTENT_PLUS_0,
const int& frame_w = DEFAULT_SEL_FRAME_WIDTH,
const int& sel_frame_w = DEFAULT_SEL_FRAME_WIDTH);
///exec main method, see also sub exec methods
int exec();
///adds additional exec key to current collection, default exit keys are CRCInput::RC_home and CRCInput::RC_setup
void addExitKey(const neutrino_msg_t& key){v_exit_keys.push_back(key);}
///remove all current exec keys from current collection, NOTE: use addExitKey() if new exec key is required
void removeExitKeys(){v_exit_keys.clear();}
///enum exec loop control
enum
{
NO_EXIT = 0,
EXIT = 1
};
///execKey() methods handle events for defined neutrino messages, see class CRCInput::, this methodes contains a signal handler named OnExecMsg, so it is possible to connect with any common function or method
///exec sub method for pressed keys, parameters1/2 by rev, parameter3 msg_list as vector contains a list of possible RC-messages for defined message, parameter4 force_exit default = false
void execKey( neutrino_msg_t& msg,
neutrino_msg_data_t& data,
int& res,
bool& cancel_exec,
const std::vector& msg_list,
bool force_exit = false);
///exec sub method for pressed key, parameters1/2 by rev, parameter3 force_exit default = false
bool execKey( neutrino_msg_t& msg,
neutrino_msg_data_t& data,
int& res,
bool& cancel_exec,
const neutrino_msg_t& msg_val,
bool force_exit = false);
///exec sub method for page scroll, parameter1 neutrino_msg_t by rev
void execPageScroll(neutrino_msg_t& msg, neutrino_msg_data_t& data, int& res, bool& cancel_exec);
///exec sub method for exit loop, parameters by rev
void execExit( neutrino_msg_t& msg,
neutrino_msg_data_t& data,
int& res, bool& cancel_exec,
const std::vector& v_msg_list);
///enum scroll direction
enum
{
SCROLL_P_DOWN = 0,
SCROLL_P_UP = 1
};
///scroll page and paint current selected page, if parameter2 = true (default)
void ScrollPage(int direction = SCROLL_P_DOWN, bool do_paint = true);
bool enableColBodyGradient(const int& enable_mode, const fb_pixel_t& sec_colorconst, const int& direction = -1 /*CFrameBuffer::gradientVertical*/);
///cleans saved screen buffer include from sub items, required by hide(), returns true if any buffer was deleted
bool clearSavedScreen();
///cleanup paint cache include from sub items, removes saved buffer contents from cached foreground layers, returns true if any buffer was removed
bool clearPaintCache();
///cleanup old gradient buffers include from sub items, returns true if any gradient buffer data was removed
bool clearFbGradientData();
///slot for repaint event, reserved for actions before repaint if paint() already was done.
sigc::slot0 sl_form_repaint;
};
#endif