//! \~\file piscreentiles.h
//! \~\ingroup Console
//! \brief
//! \~english Various tiles for PIScreen
//! \~russian Различные тайлы для PIScreen
//! \details
//! \~english Provides ready-to-use tile implementations for common UI elements.
//! \~russian Обеспечивает готовые к использованию реализации тайлов для общих элементов UI.
/*
PIP - Platform Independent Primitives
Various tiles for PIScreen
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see .
*/
#ifndef PISCREENTILES_H
#define PISCREENTILES_H
#include "pip_console_export.h"
#include "piscreentile.h"
//! \~\ingroup Console
//! \~\brief
//! \~english Simple text tile with per-row formatting.
//! \~russian Простой текстовый тайл с форматированием по строкам.
class PIP_CONSOLE_EXPORT TileSimple: public PIScreenTile {
PIOBJECT_SUBCLASS(TileSimple, PIScreenTile);
public:
//! \~english Row text with cell format.
//! \~russian Текст строки с форматом ячеек.
typedef PIPair Row;
//! \~english Constructs an empty text tile.
//! \~russian Создает пустой текстовый тайл.
TileSimple(const PIString & n = PIString());
//! \~english Constructs a text tile with one row.
//! \~russian Создает текстовый тайл с одной строкой.
TileSimple(const Row & r);
//! \~english Destroys the text tile.
//! \~russian Уничтожает текстовый тайл.
virtual ~TileSimple() {}
//! \~english Rows displayed by the tile.
//! \~russian Строки, отображаемые тайлом.
PIVector content;
//! \~english Horizontal text alignment inside the tile.
//! \~russian Горизонтальное выравнивание текста внутри тайла.
PIScreenTypes::Alignment alignment;
protected:
void sizeHint(int & w, int & h) const override;
void drawEvent(PIScreenDrawer * d) override;
};
class TileList;
//! \~\ingroup Console
//! \~\brief
//! \~english Scroll bar tile used by list-like widgets.
//! \~russian Тайловая полоса прокрутки для списковых виджетов.
class PIP_CONSOLE_EXPORT TileScrollBar: public PIScreenTile {
PIOBJECT_SUBCLASS(TileScrollBar, PIScreenTile);
friend class TileList;
public:
//! \~english Constructs a scroll bar tile.
//! \~russian Создает тайл полосы прокрутки.
TileScrollBar(const PIString & n = PIString());
//! \~english Destroys the scroll bar tile.
//! \~russian Уничтожает тайл полосы прокрутки.
virtual ~TileScrollBar() {}
//! \~english Sets the minimum scroll value.
//! \~russian Устанавливает минимальное значение прокрутки.
void setMinimum(int v);
//! \~english Sets the maximum scroll value.
//! \~russian Устанавливает максимальное значение прокрутки.
void setMaximum(int v);
//! \~english Sets the current scroll value.
//! \~russian Устанавливает текущее значение прокрутки.
void setValue(int v);
//! \~english Returns the minimum scroll value.
//! \~russian Возвращает минимальное значение прокрутки.
int minimum() const { return minimum_; }
//! \~english Returns the maximum scroll value.
//! \~russian Возвращает максимальное значение прокрутки.
int maximum() const { return maximum_; }
//! \~english Returns the current scroll value.
//! \~russian Возвращает текущее значение прокрутки.
int value() const { return value_; }
//! \~english Thickness of the drawn bar in cells, perpendicular to the scroll direction.
//! \~russian Толщина отрисовываемой полосы в ячейках поперек направления прокрутки.
int thickness;
protected:
void _check();
void sizeHint(int & w, int & h) const override;
void drawEvent(PIScreenDrawer * d) override;
bool mouseEvent(PIKbdListener::MouseEvent me) override;
int minimum_, maximum_, value_;
PIChar line_char;
};
//! \~\ingroup Console
//! \~\brief
//! \~english Scrollable list tile with optional row selection.
//! \~russian Прокручиваемый тайл списка с необязательным выбором строк.
class PIP_CONSOLE_EXPORT TileList: public PIScreenTile {
PIOBJECT_SUBCLASS(TileList, PIScreenTile);
public:
//! \~english Selection policy for list rows.
//! \~russian Режим выбора строк списка.
enum SelectionMode {
NoSelection /** \~english Rows are not selectable. \~russian Выбор строк отключен. */,
SingleSelection /** \~english At most one row can be selected. \~russian Можно выбрать не более одной строки. */,
MultiSelection /** \~english Multiple rows can be selected. \~russian Можно выбрать несколько строк. */
};
//! \~english Events emitted by the list tile.
//! \~russian События, генерируемые тайлом списка.
enum EventType {
SelectionChanged /** \~english Selection set changed. \~russian Изменился набор выбранных строк. */,
RowPressed /** \~english Current row was activated; event data stores the row index. \~russian Текущая строка была активирована; данные события содержат индекс строки. */
};
//! \~english Constructs a list tile with the specified selection mode.
//! \~russian Создает тайл списка с указанным режимом выбора.
TileList(const PIString & n = PIString(), SelectionMode sm = NoSelection);
//! \~english Destroys the list tile.
//! \~russian Уничтожает тайл списка.
virtual ~TileList() {}
//! \~english Row text with cell format.
//! \~russian Текст строки с форматом ячеек.
typedef PIPair Row;
//! \~english Rows displayed by the list.
//! \~russian Строки, отображаемые списком.
PIDeque content;
//! \~english Alignment used to draw row text.
//! \~russian Выравнивание, используемое при рисовании текста строк.
PIScreenTypes::Alignment alignment;
//! \~english Active row selection mode.
//! \~russian Текущий режим выбора строк.
SelectionMode selection_mode;
//! \~english Indexes of selected rows.
//! \~russian Индексы выбранных строк.
PISet selected;
//! \~english Cached count of visible content rows between the top and bottom scroll markers.
//! \~russian Кэшированное количество видимых строк содержимого между верхней и нижней метками прокрутки.
int lhei;
//! \~english Index of the current row used for focus and activation.
//! \~russian Индекс текущей строки, используемой для фокуса и активации.
int cur;
//! \~english Index of the first row currently visible in the viewport.
//! \~russian Индекс первой строки, видимой в текущей области просмотра.
int offset;
protected:
void sizeHint(int & w, int & h) const override;
void resizeEvent(int w, int h) override;
void drawEvent(PIScreenDrawer * d) override;
bool keyEvent(PIKbdListener::KeyEvent key) override;
bool mouseEvent(PIKbdListener::MouseEvent me) override;
bool wheelEvent(PIKbdListener::WheelEvent we) override;
TileScrollBar * scroll;
bool mouse_sel;
};
//! \~\ingroup Console
//! \~\brief
//! \~english Push button tile.
//! \~russian Тайл кнопки.
class PIP_CONSOLE_EXPORT TileButton: public PIScreenTile {
PIOBJECT_SUBCLASS(TileButton, PIScreenTile);
public:
//! \~english Constructs a button tile.
//! \~russian Создает тайл кнопки.
TileButton(const PIString & n = PIString());
//! \~english Destroys the button tile.
//! \~russian Уничтожает тайл кнопки.
virtual ~TileButton() {}
//! \~english Events emitted by the button.
//! \~russian События, генерируемые кнопкой.
enum EventType {
ButtonClicked /** \~english Button was activated. \~russian Кнопка была активирована. */
};
//! \~english Text format of the button label.
//! \~russian Формат текста надписи кнопки.
PIScreenTypes::CellFormat format;
//! \~english Button caption.
//! \~russian Подпись кнопки.
PIString text;
protected:
void sizeHint(int & w, int & h) const override;
void drawEvent(PIScreenDrawer * d) override;
bool keyEvent(PIKbdListener::KeyEvent key) override;
bool mouseEvent(PIKbdListener::MouseEvent me) override;
};
//! \~\ingroup Console
//! \~\brief
//! \~english Group of selectable buttons arranged in one tile.
//! \~russian Группа выбираемых кнопок, размещенных в одном тайле.
class PIP_CONSOLE_EXPORT TileButtons: public PIScreenTile {
PIOBJECT_SUBCLASS(TileButtons, PIScreenTile);
public:
//! \~english Constructs a button group tile.
//! \~russian Создает тайл группы кнопок.
TileButtons(const PIString & n = PIString());
//! \~english Destroys the button group tile.
//! \~russian Уничтожает тайл группы кнопок.
virtual ~TileButtons() {}
//! \~english Events emitted by the button group.
//! \~russian События, генерируемые группой кнопок.
enum EventType {
ButtonSelected /** \~english A button was selected; event data stores the button index. \~russian Кнопка была выбрана; данные события содержат индекс кнопки. */
};
//! \~english Button caption with cell format.
//! \~russian Подпись кнопки с форматом ячеек.
typedef PIPair Button;
//! \~english Alignment of the whole button group inside the tile bounds.
//! \~russian Выравнивание всей группы кнопок внутри границ тайла.
PIScreenTypes::Alignment alignment;
//! \~english Button definitions shown by the tile.
//! \~russian Описания кнопок, отображаемых тайлом.
PIVector