mirror of
https://github.com/tuxbox-neutrino/neutrino.git
synced 2025-08-29 00:11:14 +02:00
- infoviewer: add color-to-color gradient feature; THX to TangoCash ...
... for basic inspiration and dbt for some optimizations
This commit is contained in:
@@ -1432,6 +1432,8 @@ miscsettings.infobar_disp_4 Logo+Kanalname/Kanalnummer
|
|||||||
miscsettings.infobar_disp_5 Logo/Signalbalken
|
miscsettings.infobar_disp_5 Logo/Signalbalken
|
||||||
miscsettings.infobar_disp_6 Logo+Kanalnummer/Signalbalken
|
miscsettings.infobar_disp_6 Logo+Kanalnummer/Signalbalken
|
||||||
miscsettings.infobar_disp_log Logo
|
miscsettings.infobar_disp_log Logo
|
||||||
|
miscsettings.infobar_gradient_bottom Farbverlauf unten
|
||||||
|
miscsettings.infobar_gradient_top Farbverlauf oben
|
||||||
miscsettings.infobar_logo_hdd_dir Logo-Verz.
|
miscsettings.infobar_logo_hdd_dir Logo-Verz.
|
||||||
miscsettings.infobar_sat_display Kabel-/Satellitenanbieter
|
miscsettings.infobar_sat_display Kabel-/Satellitenanbieter
|
||||||
miscsettings.infobar_show Info bei EPG Änderungen
|
miscsettings.infobar_show Info bei EPG Änderungen
|
||||||
|
@@ -1432,6 +1432,8 @@ miscsettings.infobar_disp_4 Logo+channel name/number
|
|||||||
miscsettings.infobar_disp_5 Logo+signal
|
miscsettings.infobar_disp_5 Logo+signal
|
||||||
miscsettings.infobar_disp_6 Logo+channel number+signal
|
miscsettings.infobar_disp_6 Logo+channel number+signal
|
||||||
miscsettings.infobar_disp_log Logo
|
miscsettings.infobar_disp_log Logo
|
||||||
|
miscsettings.infobar_gradient_bottom Gradient bottom
|
||||||
|
miscsettings.infobar_gradient_top Gradient top
|
||||||
miscsettings.infobar_logo_hdd_dir Logo dir
|
miscsettings.infobar_logo_hdd_dir Logo dir
|
||||||
miscsettings.infobar_sat_display Satellite display on infobar
|
miscsettings.infobar_sat_display Satellite display on infobar
|
||||||
miscsettings.infobar_show show Info on EPG change
|
miscsettings.infobar_show show Info on EPG change
|
||||||
|
@@ -246,9 +246,24 @@ void CInfoViewer::changePB()
|
|||||||
|
|
||||||
void CInfoViewer::initClock()
|
void CInfoViewer::initClock()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
static int gradient_top = g_settings.theme.infobar_gradient_top;
|
||||||
|
|
||||||
|
if (gradient_top != g_settings.theme.infobar_gradient_top && clock != NULL) {
|
||||||
|
gradient_top = g_settings.theme.infobar_gradient_top;
|
||||||
|
clock->clearSavedScreen();
|
||||||
|
delete clock;
|
||||||
|
clock = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (clock == NULL){
|
if (clock == NULL){
|
||||||
clock = new CComponentsFrmClock();
|
clock = new CComponentsFrmClock();
|
||||||
clock->doPaintBg(true);
|
clock->setClockBlink("%H.%M");
|
||||||
|
clock->setClockIntervall(1);
|
||||||
|
clock->doPaintBg(!gradient_top);
|
||||||
|
clock->enableTboxSaveScreen(gradient_top);
|
||||||
|
if (time_width)
|
||||||
|
clock->setWidth(time_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
clock->setColorBody(COL_INFOBAR_PLUS_0);
|
clock->setColorBody(COL_INFOBAR_PLUS_0);
|
||||||
@@ -385,10 +400,12 @@ void CInfoViewer::paintBackground(int col_NumBox)
|
|||||||
BoxEndX - c_shadow_width, BoxEndInfoY + SHADOW_OFFSET,
|
BoxEndX - c_shadow_width, BoxEndInfoY + SHADOW_OFFSET,
|
||||||
COL_INFOBAR_SHADOW_PLUS_0, c_rad_large, CORNER_BOTTOM_LEFT);
|
COL_INFOBAR_SHADOW_PLUS_0, c_rad_large, CORNER_BOTTOM_LEFT);
|
||||||
|
|
||||||
// background for channel name, epg data
|
// background for channel name/logo and clock
|
||||||
frameBuffer->paintBox(ChanInfoX, ChanNameY, BoxEndX, BoxEndY,
|
paintHead();
|
||||||
COL_INFOBAR_PLUS_0, c_rad_large,
|
|
||||||
CORNER_TOP_RIGHT | (showButtonBar ? 0 : CORNER_BOTTOM));
|
// background for epg data
|
||||||
|
frameBuffer->paintBox(ChanInfoX, ChanNameY + time_height, BoxEndX, BoxEndY,
|
||||||
|
COL_INFOBAR_PLUS_0, c_rad_large, (showButtonBar ? CORNER_NONE : CORNER_BOTTOM));
|
||||||
|
|
||||||
// number box
|
// number box
|
||||||
frameBuffer->paintBoxRel(BoxStartX + SHADOW_OFFSET, BoxStartY + SHADOW_OFFSET,
|
frameBuffer->paintBoxRel(BoxStartX + SHADOW_OFFSET, BoxStartY + SHADOW_OFFSET,
|
||||||
@@ -399,6 +416,19 @@ void CInfoViewer::paintBackground(int col_NumBox)
|
|||||||
col_NumBox, c_rad_mid);
|
col_NumBox, c_rad_mid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CInfoViewer::paintHead()
|
||||||
|
{
|
||||||
|
CComponentsShapeSquare header(ChanInfoX, ChanNameY, BoxEndX-ChanInfoX, time_height);
|
||||||
|
|
||||||
|
header.setColorBody(g_settings.theme.infobar_gradient_top ? COL_MENUHEAD_PLUS_0 : COL_INFOBAR_PLUS_0);
|
||||||
|
header.enableColBodyGradient(g_settings.theme.infobar_gradient_top);
|
||||||
|
header.set2ndColor(COL_INFOBAR_PLUS_0);
|
||||||
|
header.setCorner(RADIUS_LARGE, CORNER_TOP_RIGHT);
|
||||||
|
clock->setColorBody(header.getColorBody());
|
||||||
|
|
||||||
|
header.paint(CC_SAVE_SCREEN_NO);
|
||||||
|
}
|
||||||
|
|
||||||
void CInfoViewer::show_current_next(bool new_chan, int epgpos)
|
void CInfoViewer::show_current_next(bool new_chan, int epgpos)
|
||||||
{
|
{
|
||||||
CEitManager::getInstance()->getCurrentNextServiceKey(channel_id, info_CurrentNext);
|
CEitManager::getInstance()->getCurrentNextServiceKey(channel_id, info_CurrentNext);
|
||||||
@@ -481,7 +511,6 @@ void CInfoViewer::showMovieTitle(const int playState, const t_channel_id &Channe
|
|||||||
last_curr_id = last_next_id = 0;
|
last_curr_id = last_next_id = 0;
|
||||||
showButtonBar = true;
|
showButtonBar = true;
|
||||||
|
|
||||||
|
|
||||||
fileplay = true;
|
fileplay = true;
|
||||||
reset_allScala();
|
reset_allScala();
|
||||||
if (!gotTime)
|
if (!gotTime)
|
||||||
|
@@ -62,8 +62,6 @@ class CInfoViewer
|
|||||||
int InfoHeightY;
|
int InfoHeightY;
|
||||||
bool fileplay;
|
bool fileplay;
|
||||||
|
|
||||||
int BoxStartX;
|
|
||||||
int BoxStartY;
|
|
||||||
int ButtonWidth;
|
int ButtonWidth;
|
||||||
|
|
||||||
// dimensions of radiotext window
|
// dimensions of radiotext window
|
||||||
@@ -108,6 +106,7 @@ class CInfoViewer
|
|||||||
uint32_t lcdUpdateTimer;
|
uint32_t lcdUpdateTimer;
|
||||||
|
|
||||||
void paintBackground(int col_Numbox);
|
void paintBackground(int col_Numbox);
|
||||||
|
void paintHead();
|
||||||
void show_Data( bool calledFromEvent = false );
|
void show_Data( bool calledFromEvent = false );
|
||||||
void display_Info(const char *current, const char *next, bool UTF8 = true,
|
void display_Info(const char *current, const char *next, bool UTF8 = true,
|
||||||
bool starttimes = true, const int pb_pos = -1,
|
bool starttimes = true, const int pb_pos = -1,
|
||||||
@@ -145,6 +144,8 @@ class CInfoViewer
|
|||||||
char aspectRatio;
|
char aspectRatio;
|
||||||
uint32_t sec_timer_id;
|
uint32_t sec_timer_id;
|
||||||
|
|
||||||
|
int BoxStartX;
|
||||||
|
int BoxStartY;
|
||||||
int BoxEndX;
|
int BoxEndX;
|
||||||
int BoxEndY;
|
int BoxEndY;
|
||||||
int ChanInfoX;
|
int ChanInfoX;
|
||||||
|
@@ -88,8 +88,6 @@ CInfoViewerBB::CInfoViewerBB()
|
|||||||
bbIconInfo[0].h = 0;
|
bbIconInfo[0].h = 0;
|
||||||
BBarY = 0;
|
BBarY = 0;
|
||||||
BBarFontY = 0;
|
BBarFontY = 0;
|
||||||
hddscale = NULL;
|
|
||||||
sysscale = NULL;
|
|
||||||
|
|
||||||
Init();
|
Init();
|
||||||
}
|
}
|
||||||
@@ -374,8 +372,8 @@ void CInfoViewerBB::showBBButtons(const int modus)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (paint) {
|
if (paint) {
|
||||||
|
paintFoot(minX - g_InfoViewer->ChanInfoX);
|
||||||
int last_x = minX;
|
int last_x = minX;
|
||||||
frameBuffer->paintBoxRel(g_InfoViewer->ChanInfoX, BBarY, minX - g_InfoViewer->ChanInfoX, InfoHeightY_Info, COL_INFOBAR_BUTTONS_BACKGROUND, RADIUS_LARGE, CORNER_BOTTOM); //round
|
|
||||||
for (i = BUTTON_MAX; i > 0;) {
|
for (i = BUTTON_MAX; i > 0;) {
|
||||||
--i;
|
--i;
|
||||||
if ((bbButtonInfo[i].x <= g_InfoViewer->ChanInfoX) || (bbButtonInfo[i].x >= g_InfoViewer->BoxEndX) || (!bbButtonInfo[i].paint))
|
if ((bbButtonInfo[i].x <= g_InfoViewer->ChanInfoX) || (bbButtonInfo[i].x >= g_InfoViewer->BoxEndX) || (!bbButtonInfo[i].paint))
|
||||||
@@ -415,7 +413,7 @@ void CInfoViewerBB::showBBIcons(const int modus, const std::string & icon)
|
|||||||
return;
|
return;
|
||||||
if ((modus >= CInfoViewerBB::ICON_SUBT) && (modus < CInfoViewerBB::ICON_MAX) && (bbIconInfo[modus].x != -1) && (is_visible)) {
|
if ((modus >= CInfoViewerBB::ICON_SUBT) && (modus < CInfoViewerBB::ICON_MAX) && (bbIconInfo[modus].x != -1) && (is_visible)) {
|
||||||
frameBuffer->paintIcon(icon, bbIconInfo[modus].x, BBarY,
|
frameBuffer->paintIcon(icon, bbIconInfo[modus].x, BBarY,
|
||||||
InfoHeightY_Info, 1, true, true, COL_INFOBAR_BUTTONS_BACKGROUND);
|
InfoHeightY_Info, 1, true, !g_settings.theme.infobar_gradient_bottom, COL_INFOBAR_BUTTONS_BACKGROUND);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -432,7 +430,7 @@ void CInfoViewerBB::paintshowButtonBar()
|
|||||||
if (g_settings.casystem_display < 2)
|
if (g_settings.casystem_display < 2)
|
||||||
paintCA_bar(0,0);
|
paintCA_bar(0,0);
|
||||||
|
|
||||||
frameBuffer->paintBoxRel(g_InfoViewer->ChanInfoX, BBarY, g_InfoViewer->BoxEndX - g_InfoViewer->ChanInfoX, InfoHeightY_Info, COL_INFOBAR_BUTTONS_BACKGROUND, RADIUS_LARGE, CORNER_BOTTOM); //round
|
paintFoot();
|
||||||
|
|
||||||
g_InfoViewer->showSNR();
|
g_InfoViewer->showSNR();
|
||||||
|
|
||||||
@@ -453,6 +451,21 @@ void CInfoViewerBB::paintshowButtonBar()
|
|||||||
showSysfsHdd();
|
showSysfsHdd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CInfoViewerBB::paintFoot(int w)
|
||||||
|
{
|
||||||
|
int width = (w == 0) ? g_InfoViewer->BoxEndX - g_InfoViewer->ChanInfoX : w;
|
||||||
|
|
||||||
|
CComponentsShapeSquare foot(g_InfoViewer->ChanInfoX, BBarY, width, InfoHeightY_Info);
|
||||||
|
|
||||||
|
foot.setColorBody(COL_INFOBAR_BUTTONS_BACKGROUND);
|
||||||
|
foot.enableColBodyGradient(g_settings.theme.infobar_gradient_bottom);
|
||||||
|
foot.setColBodyGradient(CColorGradient::gradientDark2Light, CFrameBuffer::gradientVertical);
|
||||||
|
foot.setCorner(RADIUS_LARGE, CORNER_BOTTOM);
|
||||||
|
foot.set2ndColor(COL_INFOBAR_PLUS_0);
|
||||||
|
|
||||||
|
foot.paint(CC_SAVE_SCREEN_NO);
|
||||||
|
}
|
||||||
|
|
||||||
void CInfoViewerBB::showIcon_SubT()
|
void CInfoViewerBB::showIcon_SubT()
|
||||||
{
|
{
|
||||||
if (!is_visible)
|
if (!is_visible)
|
||||||
|
@@ -109,6 +109,7 @@ class CInfoViewerBB
|
|||||||
|
|
||||||
CProgressBar *hddscale, *sysscale;
|
CProgressBar *hddscale, *sysscale;
|
||||||
|
|
||||||
|
void paintFoot(int w = 0);
|
||||||
void showBBIcons(const int modus, const std::string & icon);
|
void showBBIcons(const int modus, const std::string & icon);
|
||||||
void getBBIconInfo(void);
|
void getBBIconInfo(void);
|
||||||
bool checkBBIcon(const char * const icon, int *w, int *h);
|
bool checkBBIcon(const char * const icon, int *w, int *h);
|
||||||
|
@@ -723,6 +723,7 @@ void COsdSetup::showOsdMenueColorSetup(CMenuWidget *menu_colors)
|
|||||||
oj->setHint("", LOCALE_MENU_HINT_COLOR_GRADIENT);
|
oj->setHint("", LOCALE_MENU_HINT_COLOR_GRADIENT);
|
||||||
menu_colors->addItem(oj);
|
menu_colors->addItem(oj);
|
||||||
|
|
||||||
|
// infoviewer color
|
||||||
CColorChooser* chInfobarcolor = new CColorChooser(LOCALE_COLORMENU_BACKGROUND, &t.infobar_red,
|
CColorChooser* chInfobarcolor = new CColorChooser(LOCALE_COLORMENU_BACKGROUND, &t.infobar_red,
|
||||||
&t.infobar_green, &t.infobar_blue, &t.infobar_alpha, colorSetupNotifier);
|
&t.infobar_green, &t.infobar_blue, &t.infobar_alpha, colorSetupNotifier);
|
||||||
CColorChooser* chInfobarTextcolor = new CColorChooser(LOCALE_COLORMENU_TEXTCOLOR, &t.infobar_Text_red,
|
CColorChooser* chInfobarTextcolor = new CColorChooser(LOCALE_COLORMENU_TEXTCOLOR, &t.infobar_Text_red,
|
||||||
@@ -737,6 +738,17 @@ void COsdSetup::showOsdMenueColorSetup(CMenuWidget *menu_colors)
|
|||||||
mf->setHint("", LOCALE_MENU_HINT_INFOBAR_TEXTCOLOR);
|
mf->setHint("", LOCALE_MENU_HINT_INFOBAR_TEXTCOLOR);
|
||||||
menu_colors->addItem(mf);
|
menu_colors->addItem(mf);
|
||||||
|
|
||||||
|
// infoviewer gradient top
|
||||||
|
oj = new CMenuOptionChooser(LOCALE_MISCSETTINGS_INFOBAR_GRADIENT_TOP, &t.infobar_gradient_top, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true);
|
||||||
|
oj->setHint("", LOCALE_MENU_HINT_COLOR_GRADIENT);
|
||||||
|
menu_colors->addItem(oj);
|
||||||
|
|
||||||
|
// infoviewer gradient bottom
|
||||||
|
oj = new CMenuOptionChooser(LOCALE_MISCSETTINGS_INFOBAR_GRADIENT_BOTTOM, &t.infobar_gradient_bottom, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true);
|
||||||
|
oj->setHint("", LOCALE_MENU_HINT_COLOR_GRADIENT);
|
||||||
|
menu_colors->addItem(oj);
|
||||||
|
|
||||||
|
// colored events
|
||||||
CColorChooser* chColored_Events = new CColorChooser(LOCALE_COLORMENU_TEXTCOLOR, &t.colored_events_red,
|
CColorChooser* chColored_Events = new CColorChooser(LOCALE_COLORMENU_TEXTCOLOR, &t.colored_events_red,
|
||||||
&t.colored_events_green, &t.colored_events_blue, NULL, colorSetupNotifier);
|
&t.colored_events_green, &t.colored_events_blue, NULL, colorSetupNotifier);
|
||||||
|
|
||||||
|
@@ -275,6 +275,8 @@ void CThemes::setTheme(CConfigFile &configfile)
|
|||||||
configfile.setInt32( "infobar_red", t.infobar_red );
|
configfile.setInt32( "infobar_red", t.infobar_red );
|
||||||
configfile.setInt32( "infobar_green", t.infobar_green );
|
configfile.setInt32( "infobar_green", t.infobar_green );
|
||||||
configfile.setInt32( "infobar_blue", t.infobar_blue );
|
configfile.setInt32( "infobar_blue", t.infobar_blue );
|
||||||
|
configfile.setInt32( "infobar_gradient_top", t.infobar_gradient_top );
|
||||||
|
configfile.setInt32( "infobar_gradient_bottom", t.infobar_gradient_bottom );
|
||||||
configfile.setInt32( "infobar_Text_alpha", t.infobar_Text_alpha );
|
configfile.setInt32( "infobar_Text_alpha", t.infobar_Text_alpha );
|
||||||
configfile.setInt32( "infobar_Text_red", t.infobar_Text_red );
|
configfile.setInt32( "infobar_Text_red", t.infobar_Text_red );
|
||||||
configfile.setInt32( "infobar_Text_green", t.infobar_Text_green );
|
configfile.setInt32( "infobar_Text_green", t.infobar_Text_green );
|
||||||
@@ -330,6 +332,8 @@ void CThemes::getTheme(CConfigFile &configfile)
|
|||||||
t.infobar_red = configfile.getInt32( "infobar_red", 0x00 );
|
t.infobar_red = configfile.getInt32( "infobar_red", 0x00 );
|
||||||
t.infobar_green = configfile.getInt32( "infobar_green", 0x0e );
|
t.infobar_green = configfile.getInt32( "infobar_green", 0x0e );
|
||||||
t.infobar_blue = configfile.getInt32( "infobar_blue", 0x23 );
|
t.infobar_blue = configfile.getInt32( "infobar_blue", 0x23 );
|
||||||
|
t.infobar_gradient_top = configfile.getInt32( "infobar_gradient_top", 0 );
|
||||||
|
t.infobar_gradient_bottom = configfile.getInt32( "infobar_gradient_bottom", 0 );
|
||||||
t.infobar_Text_alpha = configfile.getInt32( "infobar_Text_alpha", 0x00 );
|
t.infobar_Text_alpha = configfile.getInt32( "infobar_Text_alpha", 0x00 );
|
||||||
t.infobar_Text_red = configfile.getInt32( "infobar_Text_red", 0x64 );
|
t.infobar_Text_red = configfile.getInt32( "infobar_Text_red", 0x64 );
|
||||||
t.infobar_Text_green = configfile.getInt32( "infobar_Text_green", 0x64 );
|
t.infobar_Text_green = configfile.getInt32( "infobar_Text_green", 0x64 );
|
||||||
|
@@ -1459,6 +1459,8 @@ typedef enum
|
|||||||
LOCALE_MISCSETTINGS_INFOBAR_DISP_5,
|
LOCALE_MISCSETTINGS_INFOBAR_DISP_5,
|
||||||
LOCALE_MISCSETTINGS_INFOBAR_DISP_6,
|
LOCALE_MISCSETTINGS_INFOBAR_DISP_6,
|
||||||
LOCALE_MISCSETTINGS_INFOBAR_DISP_LOG,
|
LOCALE_MISCSETTINGS_INFOBAR_DISP_LOG,
|
||||||
|
LOCALE_MISCSETTINGS_INFOBAR_GRADIENT_BOTTOM,
|
||||||
|
LOCALE_MISCSETTINGS_INFOBAR_GRADIENT_TOP,
|
||||||
LOCALE_MISCSETTINGS_INFOBAR_LOGO_HDD_DIR,
|
LOCALE_MISCSETTINGS_INFOBAR_LOGO_HDD_DIR,
|
||||||
LOCALE_MISCSETTINGS_INFOBAR_SAT_DISPLAY,
|
LOCALE_MISCSETTINGS_INFOBAR_SAT_DISPLAY,
|
||||||
LOCALE_MISCSETTINGS_INFOBAR_SHOW,
|
LOCALE_MISCSETTINGS_INFOBAR_SHOW,
|
||||||
|
@@ -1459,6 +1459,8 @@ const char * locale_real_names[] =
|
|||||||
"miscsettings.infobar_disp_5",
|
"miscsettings.infobar_disp_5",
|
||||||
"miscsettings.infobar_disp_6",
|
"miscsettings.infobar_disp_6",
|
||||||
"miscsettings.infobar_disp_log",
|
"miscsettings.infobar_disp_log",
|
||||||
|
"miscsettings.infobar_gradient_bottom",
|
||||||
|
"miscsettings.infobar_gradient_top",
|
||||||
"miscsettings.infobar_logo_hdd_dir",
|
"miscsettings.infobar_logo_hdd_dir",
|
||||||
"miscsettings.infobar_sat_display",
|
"miscsettings.infobar_sat_display",
|
||||||
"miscsettings.infobar_show",
|
"miscsettings.infobar_show",
|
||||||
|
@@ -104,6 +104,9 @@ struct SNeutrinoTheme
|
|||||||
unsigned char infobar_Text_green;
|
unsigned char infobar_Text_green;
|
||||||
unsigned char infobar_Text_blue;
|
unsigned char infobar_Text_blue;
|
||||||
|
|
||||||
|
int infobar_gradient_top;
|
||||||
|
int infobar_gradient_bottom;
|
||||||
|
|
||||||
unsigned char colored_events_alpha;
|
unsigned char colored_events_alpha;
|
||||||
unsigned char colored_events_red;
|
unsigned char colored_events_red;
|
||||||
unsigned char colored_events_green;
|
unsigned char colored_events_green;
|
||||||
@@ -370,6 +373,8 @@ struct SNeutrinoSettings
|
|||||||
int colored_events_channellist;
|
int colored_events_channellist;
|
||||||
int colored_events_infobar;
|
int colored_events_infobar;
|
||||||
int contrast_fonts;
|
int contrast_fonts;
|
||||||
|
int infobar_gradient_top;
|
||||||
|
int infobar_gradient_bottom;
|
||||||
|
|
||||||
//network
|
//network
|
||||||
#define NETWORK_NFS_NR_OF_ENTRIES 8
|
#define NETWORK_NFS_NR_OF_ENTRIES 8
|
||||||
|
Reference in New Issue
Block a user