Squashed commit of the following:
apps/graphics/twm4nx: Try to improve icon text spacing. Not noticeably better, however. apps/graphics: Split long icon title on two lines below the icon image. apps/graphics/twm4nx: Both iconification and de-iconification work. apps/graphics/twm4nx: Various fixed toward de-iconifying a window. Progress but still not there yet.
This commit is contained in:
parent
1879949cdc
commit
02c148e07e
@ -1,5 +1,5 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
// apps/graphics/twm4nx/include/cbackground.hxx
|
// apps/graphics/twm4nx/include/cbackground.cxx
|
||||||
// Manage background image
|
// Manage background image
|
||||||
//
|
//
|
||||||
// Copyright (C) 2019 Gregory Nutt. All rights reserved.
|
// Copyright (C) 2019 Gregory Nutt. All rights reserved.
|
||||||
@ -167,6 +167,68 @@ void CBackground::getDisplaySize(FAR struct nxgl_size_s &size)
|
|||||||
rect.getSize(size);
|
rect.getSize(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the background window redraw.
|
||||||
|
*
|
||||||
|
* @param nxRect The region in the window that must be redrawn.
|
||||||
|
* @param more True means that more re-draw requests will follow
|
||||||
|
* @return true on success
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool CBackground::redrawBackgroundWindow(FAR const struct nxgl_rect_s *rect,
|
||||||
|
bool more)
|
||||||
|
{
|
||||||
|
twminfo("Redrawing..\n");
|
||||||
|
|
||||||
|
// Get the widget control from the background window
|
||||||
|
|
||||||
|
NXWidgets::CWidgetControl *control = m_backWindow->getWidgetControl();
|
||||||
|
|
||||||
|
// Get the graphics port for drawing on the background window
|
||||||
|
|
||||||
|
NXWidgets::CGraphicsPort *port = control->getGraphicsPort();
|
||||||
|
|
||||||
|
// Get the size of the region to redraw
|
||||||
|
|
||||||
|
struct nxgl_size_s redrawSize;
|
||||||
|
redrawSize.w = rect->pt2.x - rect->pt1.x + 1;
|
||||||
|
redrawSize.h = rect->pt2.y - rect->pt1.y + 1;
|
||||||
|
|
||||||
|
// Fill the redraw region with the background color
|
||||||
|
|
||||||
|
port->drawFilledRect(rect->pt1.x, rect->pt1.y,
|
||||||
|
redrawSize.w, redrawSize.h,
|
||||||
|
CONFIG_TWM4NX_DEFAULT_BACKGROUNDCOLOR);
|
||||||
|
|
||||||
|
if (m_backImage != (NXWidgets::CImage *)0)
|
||||||
|
{
|
||||||
|
// Does any part of the image need to be redrawn?
|
||||||
|
|
||||||
|
FAR NXWidgets::CRect cimageRect = m_backImage->getBoundingBox();
|
||||||
|
|
||||||
|
struct nxgl_rect_s imageRect;
|
||||||
|
cimageRect.getNxRect(&imageRect);
|
||||||
|
|
||||||
|
struct nxgl_rect_s intersection;
|
||||||
|
nxgl_rectintersect(&intersection, rect, &imageRect);
|
||||||
|
|
||||||
|
if (!nxgl_nullrect(&intersection))
|
||||||
|
{
|
||||||
|
// Then re-draw the background image on the window
|
||||||
|
|
||||||
|
m_backImage->enableDrawing();
|
||||||
|
m_backImage->redraw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now redraw any background icons that need to be redrawn
|
||||||
|
|
||||||
|
FAR CIcon *cicon = m_twm4nx->getIcon();
|
||||||
|
cicon->redrawIcons(rect, more);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle EVENT_BACKGROUND events.
|
* Handle EVENT_BACKGROUND events.
|
||||||
*
|
*
|
||||||
@ -355,65 +417,3 @@ bool CBackground::
|
|||||||
m_backImage->redraw();
|
m_backImage->redraw();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle the background window redraw.
|
|
||||||
*
|
|
||||||
* @param nxRect The region in the window that must be redrawn.
|
|
||||||
* @param more True means that more re-draw requests will follow
|
|
||||||
* @return true on success
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool CBackground::redrawBackgroundWindow(FAR const struct nxgl_rect_s *rect,
|
|
||||||
bool more)
|
|
||||||
{
|
|
||||||
twminfo("Redrawing..\n");
|
|
||||||
|
|
||||||
// Get the widget control from the background window
|
|
||||||
|
|
||||||
NXWidgets::CWidgetControl *control = m_backWindow->getWidgetControl();
|
|
||||||
|
|
||||||
// Get the graphics port for drawing on the background window
|
|
||||||
|
|
||||||
NXWidgets::CGraphicsPort *port = control->getGraphicsPort();
|
|
||||||
|
|
||||||
// Get the size of the region to redraw
|
|
||||||
|
|
||||||
struct nxgl_size_s redrawSize;
|
|
||||||
redrawSize.w = rect->pt2.x - rect->pt1.x + 1;
|
|
||||||
redrawSize.h = rect->pt2.y - rect->pt1.y + 1;
|
|
||||||
|
|
||||||
// Fill the redraw region with the background color
|
|
||||||
|
|
||||||
port->drawFilledRect(rect->pt1.x, rect->pt1.y,
|
|
||||||
redrawSize.w, redrawSize.h,
|
|
||||||
CONFIG_TWM4NX_DEFAULT_BACKGROUNDCOLOR);
|
|
||||||
|
|
||||||
if (m_backImage != (NXWidgets::CImage *)0)
|
|
||||||
{
|
|
||||||
// Does any part of the image need to be redrawn?
|
|
||||||
|
|
||||||
FAR NXWidgets::CRect cimageRect = m_backImage->getBoundingBox();
|
|
||||||
|
|
||||||
struct nxgl_rect_s imageRect;
|
|
||||||
cimageRect.getNxRect(&imageRect);
|
|
||||||
|
|
||||||
struct nxgl_rect_s intersection;
|
|
||||||
nxgl_rectintersect(&intersection, rect, &imageRect);
|
|
||||||
|
|
||||||
if (!nxgl_nullrect(&intersection))
|
|
||||||
{
|
|
||||||
// Then re-draw the background image on the window
|
|
||||||
|
|
||||||
m_backImage->enableDrawing();
|
|
||||||
m_backImage->redraw();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now redraw any background icons that need to be redrawn
|
|
||||||
|
|
||||||
FAR CIcon *cicon = m_twm4nx->getIcon();
|
|
||||||
cicon->redrawIcons(rect, more);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
@ -56,12 +56,23 @@
|
|||||||
#include "graphics/twm4nx/twm4nx_config.hxx"
|
#include "graphics/twm4nx/twm4nx_config.hxx"
|
||||||
#include "graphics/twm4nx/ctwm4nx.hxx"
|
#include "graphics/twm4nx/ctwm4nx.hxx"
|
||||||
#include "graphics/twm4nx/cfonts.hxx"
|
#include "graphics/twm4nx/cfonts.hxx"
|
||||||
|
#include "graphics/twm4nx/cwindow.hxx"
|
||||||
#include "graphics/twm4nx/ciconwidget.hxx"
|
#include "graphics/twm4nx/ciconwidget.hxx"
|
||||||
#include "graphics/twm4nx/twm4nx_widgetevents.hxx"
|
#include "graphics/twm4nx/twm4nx_widgetevents.hxx"
|
||||||
#include "graphics/twm4nx/twm4nx_cursor.hxx"
|
#include "graphics/twm4nx/twm4nx_cursor.hxx"
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
// CIconWidget Definitions
|
// Pre-processor Definitions
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// No additional vertical spacing is necessary because there is plenty of
|
||||||
|
// space in the maximum font height
|
||||||
|
|
||||||
|
#define ICONWIDGET_IMAGE_VSPACING 2 // Lines between image and upper text
|
||||||
|
#define ICONWIDGET_TEXT_VSPACING 0 // Lines betweern upper and lower text
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// CIconWidget Method Implementations
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
using namespace Twm4Nx;
|
using namespace Twm4Nx;
|
||||||
@ -84,13 +95,19 @@ CIconWidget::CIconWidget(FAR CTwm4Nx *twm4nx,
|
|||||||
FAR NXWidgets::CWidgetStyle *style)
|
FAR NXWidgets::CWidgetStyle *style)
|
||||||
: CNxWidget(widgetControl, x, y, 0, 0, WIDGET_BORDERLESS, style)
|
: CNxWidget(widgetControl, x, y, 0, 0, WIDGET_BORDERLESS, style)
|
||||||
{
|
{
|
||||||
m_twm4nx = twm4nx; // Save the Twm4Nx session instance
|
m_twm4nx = twm4nx; // Save the Twm4Nx session instance
|
||||||
m_widgetControl = widgetControl; // Save the widget control instance
|
m_parent = (FAR CWindow *)0; // No parent window yes
|
||||||
m_eventq = (mqd_t)-1; // No widget message queue yet
|
m_widgetControl = widgetControl; // Save the widget control instance
|
||||||
|
m_eventq = (mqd_t)-1; // No widget message queue yet
|
||||||
|
|
||||||
|
// Dragging
|
||||||
|
|
||||||
|
m_drag = false; // No drag in-progress */
|
||||||
|
m_moved = false; // Icon has not been moved */
|
||||||
|
|
||||||
// Configure the widget
|
// Configure the widget
|
||||||
|
|
||||||
m_flags.borderless = true; // The widget is borless (and transparent)
|
m_flags.borderless = true; // The widget is borless (and transparent)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -112,12 +129,14 @@ CIconWidget::~CIconWidget(void)
|
|||||||
* Perform widget initialization that could fail and so it not appropriate
|
* Perform widget initialization that could fail and so it not appropriate
|
||||||
* for the constructor
|
* for the constructor
|
||||||
*
|
*
|
||||||
|
* @param parent The parent window. Needed for de-iconification.
|
||||||
* @param ibitmap The bitmap image representing the icon
|
* @param ibitmap The bitmap image representing the icon
|
||||||
* @param title The icon title string
|
* @param title The icon title string
|
||||||
* @return True is returned if the widget is successfully initialized.
|
* @return True is returned if the widget is successfully initialized.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool CIconWidget::initialize(FAR NXWidgets::IBitmap *ibitmap,
|
bool CIconWidget::initialize(FAR CWindow *parent,
|
||||||
|
FAR NXWidgets::IBitmap *ibitmap,
|
||||||
FAR const NXWidgets::CNxString &title)
|
FAR const NXWidgets::CNxString &title)
|
||||||
{
|
{
|
||||||
// Open a message queue to send fully digested NxWidget events.
|
// Open a message queue to send fully digested NxWidget events.
|
||||||
@ -138,20 +157,99 @@ bool CIconWidget::initialize(FAR NXWidgets::IBitmap *ibitmap,
|
|||||||
iconImageSize.w = ibitmap->getWidth();
|
iconImageSize.w = ibitmap->getWidth();
|
||||||
iconImageSize.h = ibitmap->getHeight();
|
iconImageSize.h = ibitmap->getHeight();
|
||||||
|
|
||||||
// Get the size of the Icon name
|
// Get the size of the Icon title
|
||||||
|
|
||||||
FAR CFonts *fonts = m_twm4nx->getFonts();
|
FAR CFonts *fonts = m_twm4nx->getFonts();
|
||||||
FAR NXWidgets::CNxFont *iconFont = fonts->getIconFont();
|
FAR NXWidgets::CNxFont *iconFont = fonts->getIconFont();
|
||||||
|
|
||||||
struct nxgl_size_s iconLabelSize;
|
struct nxgl_size_s titleSize;
|
||||||
iconLabelSize.w = iconFont->getStringWidth(title);
|
titleSize.w = iconFont->getStringWidth(title);
|
||||||
iconLabelSize.h = iconFont->getHeight();
|
titleSize.h = iconFont->getHeight();
|
||||||
|
|
||||||
|
// Divide long Icon names into two lines
|
||||||
|
|
||||||
|
FAR NXWidgets::CNxString topString;
|
||||||
|
struct nxgl_size_s iconTopLabelSize;
|
||||||
|
|
||||||
|
FAR NXWidgets::CNxString bottomString;
|
||||||
|
struct nxgl_size_s iconBottomLabelSize;
|
||||||
|
iconBottomLabelSize.w = 0;
|
||||||
|
iconBottomLabelSize.h = 0;
|
||||||
|
|
||||||
|
int sIndex = title.indexOf(' ');
|
||||||
|
if (titleSize.w <= iconImageSize.w || sIndex < 0)
|
||||||
|
{
|
||||||
|
// The icon title is short or contains no simple dividing point
|
||||||
|
|
||||||
|
topString.setText(title);
|
||||||
|
iconTopLabelSize.w = titleSize.w;
|
||||||
|
iconTopLabelSize.h = titleSize.h;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Try dividing the string
|
||||||
|
|
||||||
|
nxgl_coord_t halfWidth = titleSize.w / 2;
|
||||||
|
|
||||||
|
nxgl_coord_t sWidth =
|
||||||
|
iconFont->getStringWidth(title.subString(0, sIndex));
|
||||||
|
|
||||||
|
nxgl_coord_t error = halfWidth - sWidth;
|
||||||
|
if (error < 0)
|
||||||
|
{
|
||||||
|
error = -error;
|
||||||
|
}
|
||||||
|
|
||||||
|
int index;
|
||||||
|
while ((index = title.indexOf(' ', sIndex + 1)) > 0)
|
||||||
|
{
|
||||||
|
// Which is the better division point? index or SIndex?
|
||||||
|
|
||||||
|
nxgl_coord_t width =
|
||||||
|
iconFont->getStringWidth(title.subString(0, index));
|
||||||
|
|
||||||
|
nxgl_coord_t tmperr = halfWidth - width;
|
||||||
|
if (tmperr < 0)
|
||||||
|
{
|
||||||
|
tmperr = -tmperr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Break out if the errors are becoming larger
|
||||||
|
|
||||||
|
if (tmperr >= error)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = tmperr;
|
||||||
|
sIndex = index;
|
||||||
|
}
|
||||||
|
|
||||||
|
topString.setText(title.subString(0, sIndex));
|
||||||
|
iconTopLabelSize.w = iconFont->getStringWidth(topString);
|
||||||
|
iconTopLabelSize.h = iconFont->getHeight();
|
||||||
|
|
||||||
|
bottomString.setText(title.subString(sIndex + 1));
|
||||||
|
iconBottomLabelSize.w = iconFont->getStringWidth(bottomString);
|
||||||
|
iconBottomLabelSize.h = iconFont->getHeight();
|
||||||
|
}
|
||||||
|
|
||||||
// Determine the new size of the containing widget
|
// Determine the new size of the containing widget
|
||||||
|
|
||||||
|
nxgl_coord_t maxLabelWidth = ngl_max(iconTopLabelSize.w,
|
||||||
|
iconBottomLabelSize.w);
|
||||||
|
|
||||||
struct nxgl_size_s iconWidgetSize;
|
struct nxgl_size_s iconWidgetSize;
|
||||||
iconWidgetSize.w = ngl_max(iconImageSize.w, iconLabelSize.w);
|
iconWidgetSize.w = ngl_max(iconImageSize.w, maxLabelWidth);
|
||||||
iconWidgetSize.h = iconImageSize.h + iconLabelSize.h + 2;
|
iconWidgetSize.h = iconImageSize.h + iconTopLabelSize.h +
|
||||||
|
ICONWIDGET_IMAGE_VSPACING;
|
||||||
|
|
||||||
|
// Check if there is a bottom label
|
||||||
|
|
||||||
|
if (iconBottomLabelSize.h > 0)
|
||||||
|
{
|
||||||
|
iconWidgetSize.h += iconBottomLabelSize.h + ICONWIDGET_TEXT_VSPACING;
|
||||||
|
}
|
||||||
|
|
||||||
// Update the widget size
|
// Update the widget size
|
||||||
|
|
||||||
@ -164,9 +262,9 @@ bool CIconWidget::initialize(FAR NXWidgets::IBitmap *ibitmap,
|
|||||||
iconImagePos.x = 0;
|
iconImagePos.x = 0;
|
||||||
iconImagePos.y = 0;
|
iconImagePos.y = 0;
|
||||||
|
|
||||||
if (iconLabelSize.w > (iconImageSize.w + 1))
|
if (iconImageSize.w < (maxLabelWidth + 1))
|
||||||
{
|
{
|
||||||
iconImagePos.x = (iconLabelSize.w - iconImageSize.w) / 2;
|
iconImagePos.x = (maxLabelWidth - iconImageSize.w) / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a new CImage to hold the bitmap image
|
// Create a new CImage to hold the bitmap image
|
||||||
@ -184,50 +282,102 @@ bool CIconWidget::initialize(FAR NXWidgets::IBitmap *ibitmap,
|
|||||||
// Configure the image
|
// Configure the image
|
||||||
|
|
||||||
image->setBorderless(true);
|
image->setBorderless(true);
|
||||||
image->disable();
|
image->enable();
|
||||||
image->disableDrawing();
|
image->disableDrawing();
|
||||||
image->setRaisesEvents(true);
|
image->setRaisesEvents(true);
|
||||||
|
|
||||||
// Get the position icon text, centering horizontally if the image
|
|
||||||
// width is larger than the text width
|
|
||||||
|
|
||||||
struct nxgl_point_s iconLabelPos;
|
|
||||||
iconLabelPos.x = 0;
|
|
||||||
iconLabelPos.y = iconImageSize.h + 2;
|
|
||||||
|
|
||||||
if (iconImageSize.w > (iconLabelSize.w + 1))
|
|
||||||
{
|
|
||||||
iconLabelPos.x = (iconImageSize.w - iconLabelSize.w) / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a new CLabel to hold the icon text
|
|
||||||
|
|
||||||
FAR NXWidgets::CLabel *label =
|
|
||||||
new NXWidgets::CLabel(m_widgetControl, iconLabelPos.x, iconLabelPos.y,
|
|
||||||
iconLabelSize.w, iconLabelSize.h, title,
|
|
||||||
&m_style);
|
|
||||||
if (label == (FAR NXWidgets::CLabel *)0)
|
|
||||||
{
|
|
||||||
twmerr("ERROR: Failed to create icon label\n");
|
|
||||||
delete image;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure the icon label
|
|
||||||
|
|
||||||
label->setFont(iconFont);
|
|
||||||
label->setBorderless(true);
|
|
||||||
label->disable();
|
|
||||||
label->disableDrawing();
|
|
||||||
label->setRaisesEvents(true);
|
|
||||||
|
|
||||||
// Add the CImage to to the containing widget
|
// Add the CImage to to the containing widget
|
||||||
|
|
||||||
image->addWidgetEventHandler(this);
|
image->addWidgetEventHandler(this);
|
||||||
addWidget(image);
|
addWidget(image);
|
||||||
|
|
||||||
label->addWidgetEventHandler(this);
|
// Get the position upper icon title, centering horizontally if the image
|
||||||
addWidget(label);
|
// width is larger than the text width
|
||||||
|
|
||||||
|
struct nxgl_point_s iconTopLabelPos;
|
||||||
|
iconTopLabelPos.x = 0;
|
||||||
|
iconTopLabelPos.y = iconImageSize.h + ICONWIDGET_IMAGE_VSPACING;
|
||||||
|
|
||||||
|
if (iconWidgetSize.w > (iconTopLabelSize.w + 1))
|
||||||
|
{
|
||||||
|
iconTopLabelPos.x = (iconWidgetSize.w - iconTopLabelSize.w) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new CLabel to hold the upper icon title
|
||||||
|
|
||||||
|
FAR NXWidgets::CLabel *topLabel =
|
||||||
|
new NXWidgets::CLabel(m_widgetControl, iconTopLabelPos.x,
|
||||||
|
iconTopLabelPos.y, iconTopLabelSize.w,
|
||||||
|
iconTopLabelSize.h, topString, &m_style);
|
||||||
|
if (topLabel == (FAR NXWidgets::CLabel *)0)
|
||||||
|
{
|
||||||
|
twmerr("ERROR: Failed to create icon topLabel\n");
|
||||||
|
delete image;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configure the icon topLabel
|
||||||
|
|
||||||
|
topLabel->setFont(iconFont);
|
||||||
|
topLabel->setBorderless(true);
|
||||||
|
topLabel->enable();
|
||||||
|
topLabel->disableDrawing();
|
||||||
|
topLabel->setRaisesEvents(true);
|
||||||
|
|
||||||
|
// Add the top label to to the containing widget
|
||||||
|
|
||||||
|
topLabel->addWidgetEventHandler(this);
|
||||||
|
addWidget(topLabel);
|
||||||
|
|
||||||
|
// Check if there is a bottom label
|
||||||
|
|
||||||
|
if (iconBottomLabelSize.h > 0)
|
||||||
|
{
|
||||||
|
// Get the position lower icon title, centering horizontally if the image
|
||||||
|
// width is larger than the text width
|
||||||
|
|
||||||
|
struct nxgl_point_s iconBottomLabelPos;
|
||||||
|
iconBottomLabelPos.x = 0;
|
||||||
|
iconBottomLabelPos.y = iconImageSize.h + iconTopLabelSize.h +
|
||||||
|
ICONWIDGET_IMAGE_VSPACING +
|
||||||
|
ICONWIDGET_TEXT_VSPACING;
|
||||||
|
|
||||||
|
if (iconWidgetSize.w > (iconBottomLabelSize.w + 1))
|
||||||
|
{
|
||||||
|
iconBottomLabelPos.x = (iconWidgetSize.w - iconBottomLabelSize.w) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new CLabel to hold the lower icon title
|
||||||
|
|
||||||
|
FAR NXWidgets::CLabel *bottomLabel =
|
||||||
|
new NXWidgets::CLabel(m_widgetControl, iconBottomLabelPos.x,
|
||||||
|
iconBottomLabelPos.y, iconBottomLabelSize.w,
|
||||||
|
iconBottomLabelSize.h, bottomString,&m_style);
|
||||||
|
if (bottomLabel == (FAR NXWidgets::CLabel *)0)
|
||||||
|
{
|
||||||
|
twmerr("ERROR: Failed to create icon bottomLabel\n");
|
||||||
|
delete topLabel;
|
||||||
|
delete image;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configure the icon bottomLabel
|
||||||
|
|
||||||
|
bottomLabel->setFont(iconFont);
|
||||||
|
bottomLabel->setBorderless(true);
|
||||||
|
bottomLabel->enable();
|
||||||
|
bottomLabel->disableDrawing();
|
||||||
|
bottomLabel->setRaisesEvents(true);
|
||||||
|
|
||||||
|
// Add the top label to to the containing widget
|
||||||
|
|
||||||
|
bottomLabel->addWidgetEventHandler(this);
|
||||||
|
addWidget(bottomLabel);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save the parent window
|
||||||
|
|
||||||
|
m_parent = parent;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -486,9 +636,11 @@ void CIconWidget::handleReleaseOutsideEvent(const NXWidgets::CWidgetEventArgs &e
|
|||||||
|
|
||||||
bool CIconWidget::iconGrab(FAR struct SEventMsg *eventmsg)
|
bool CIconWidget::iconGrab(FAR struct SEventMsg *eventmsg)
|
||||||
{
|
{
|
||||||
// Indicate that dragging has started.
|
// Indicate that dragging has started but the icon has not
|
||||||
|
// yet been moved.
|
||||||
|
|
||||||
m_drag = false;
|
m_drag = true;
|
||||||
|
m_moved = false;
|
||||||
|
|
||||||
// Get the icon position.
|
// Get the icon position.
|
||||||
|
|
||||||
@ -554,9 +706,27 @@ bool CIconWidget::iconDrag(FAR struct SEventMsg *eventmsg)
|
|||||||
newpos.y = displaySize.h - m_dragCSize.h;
|
newpos.y = displaySize.h - m_dragCSize.h;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the new window position
|
// Check if the icon has moved
|
||||||
|
|
||||||
return moveTo(newpos.x, newpos.y);
|
struct nxgl_point_s oldpos;
|
||||||
|
getPos(oldpos);
|
||||||
|
|
||||||
|
if (oldpos.x != newpos.x || oldpos.y != newpos.y)
|
||||||
|
{
|
||||||
|
// Set the new window position
|
||||||
|
|
||||||
|
if (!moveTo(newpos.x, newpos.y))
|
||||||
|
{
|
||||||
|
gerr("ERROR: moveTo() failed\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The icon was moved... we are really dragging!
|
||||||
|
|
||||||
|
m_moved = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -573,19 +743,30 @@ bool CIconWidget::iconDrag(FAR struct SEventMsg *eventmsg)
|
|||||||
|
|
||||||
bool CIconWidget::iconUngrab(FAR struct SEventMsg *eventmsg)
|
bool CIconWidget::iconUngrab(FAR struct SEventMsg *eventmsg)
|
||||||
{
|
{
|
||||||
// One last position update
|
// One last position update (but only if was previously moved)
|
||||||
|
|
||||||
if (!iconDrag(eventmsg))
|
if (m_moved && !iconDrag(eventmsg))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Restore the normal cursor image
|
||||||
|
|
||||||
|
m_twm4nx->setCursorImage(&CONFIG_TWM4NX_CURSOR_IMAGE);
|
||||||
|
|
||||||
|
// There are two possibilities: (1) The icon was moved. In this case, we
|
||||||
|
// leave the icon up and in its new position. Or (2) the icon was simply
|
||||||
|
// clicked in which case we need to de-iconify the window.
|
||||||
|
|
||||||
|
if (!m_moved)
|
||||||
|
{
|
||||||
|
m_parent->deIconify();
|
||||||
|
}
|
||||||
|
|
||||||
// Indicate no longer dragging
|
// Indicate no longer dragging
|
||||||
|
|
||||||
m_drag = false;
|
m_drag = false;
|
||||||
|
m_moved = false;
|
||||||
|
|
||||||
// Restore the normal cursor image
|
return true;
|
||||||
|
|
||||||
m_twm4nx->setCursorImage(&CONFIG_TWM4NX_CURSOR_IMAGE);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
@ -325,7 +325,7 @@ bool CWindow::initialize(FAR const char *name,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_iconWidget->initialize(m_iconBitMap, m_name))
|
if (!m_iconWidget->initialize(this, m_iconBitMap, m_name))
|
||||||
{
|
{
|
||||||
twmerr("ERROR: Failed to initialize the icon widget\n");
|
twmerr("ERROR: Failed to initialize the icon widget\n");
|
||||||
cleanup();
|
cleanup();
|
||||||
@ -508,12 +508,32 @@ void CWindow::deIconify(void)
|
|||||||
m_iconified = false;
|
m_iconified = false;
|
||||||
m_nxWin->show();
|
m_nxWin->show();
|
||||||
|
|
||||||
// Hide the icon widget
|
// Disable the icon widget
|
||||||
|
|
||||||
m_iconOn = false;
|
m_iconOn = false;
|
||||||
m_iconWidget->disableDrawing();
|
m_iconWidget->disableDrawing();
|
||||||
m_iconWidget->disable();
|
m_iconWidget->disable();
|
||||||
|
|
||||||
|
// Redraw the background window in the rectangle previously occupied
|
||||||
|
// by the widget.
|
||||||
|
|
||||||
|
struct nxgl_size_s size;
|
||||||
|
m_iconWidget->getSize(size);
|
||||||
|
|
||||||
|
struct nxgl_rect_s rect;
|
||||||
|
m_iconWidget->getPos(rect.pt1);
|
||||||
|
|
||||||
|
rect.pt2.x = rect.pt1.x + size.w - 1;
|
||||||
|
rect.pt2.y = rect.pt1.y + size.h - 1;
|
||||||
|
|
||||||
|
FAR CBackground *backgd = m_twm4nx->getBackground();
|
||||||
|
if (!backgd->redrawBackgroundWindow(&rect, false))
|
||||||
|
{
|
||||||
|
gerr("ERROR: redrawBackgroundWindow() failed\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure everything is in sync
|
||||||
|
|
||||||
m_nxWin->synchronize();
|
m_nxWin->synchronize();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1111,7 +1131,7 @@ bool CWindow::createToolbarTitle(FAR const char *name)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* After the toolbar was grabbed, it may be dragged then dropped, or it
|
* After the toolbar was grabbed, it may be dragged then dropped, or it
|
||||||
* may be simply "un-grabbed". Both cases are handled here.
|
* may be simply "un-grabbed". Both cases are handled here.
|
||||||
*
|
*
|
||||||
* NOTE: Unlike the other event handlers, this does NOT override any
|
* NOTE: Unlike the other event handlers, this does NOT override any
|
||||||
* virtual event handling methods. It just combines some common event-
|
* virtual event handling methods. It just combines some common event-
|
||||||
@ -1122,10 +1142,6 @@ bool CWindow::createToolbarTitle(FAR const char *name)
|
|||||||
|
|
||||||
void CWindow::handleUngrabEvent(const NXWidgets::CWidgetEventArgs &e)
|
void CWindow::handleUngrabEvent(const NXWidgets::CWidgetEventArgs &e)
|
||||||
{
|
{
|
||||||
// Exit the dragging state
|
|
||||||
|
|
||||||
m_drag = false;
|
|
||||||
|
|
||||||
// Generate the un-grab event
|
// Generate the un-grab event
|
||||||
|
|
||||||
struct SEventMsg msg;
|
struct SEventMsg msg;
|
||||||
|
@ -169,6 +169,11 @@ namespace NXWidgets
|
|||||||
|
|
||||||
nxgl_coord_t getStringWidth(const CNxString &text) const;
|
nxgl_coord_t getStringWidth(const CNxString &text) const;
|
||||||
|
|
||||||
|
inline nxgl_coord_t getStringWidth(FAR const CNxString *text) const
|
||||||
|
{
|
||||||
|
return getStringWidth(*text);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the width of a portion of a string in pixels when drawn with this
|
* Get the width of a portion of a string in pixels when drawn with this
|
||||||
* font.
|
* font.
|
||||||
@ -179,9 +184,15 @@ namespace NXWidgets
|
|||||||
* @return The width of the substring in pixels.
|
* @return The width of the substring in pixels.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
nxgl_coord_t getStringWidth(const CNxString& text,
|
nxgl_coord_t getStringWidth(const CNxString &text,
|
||||||
int startIndex, int length) const;
|
int startIndex, int length) const;
|
||||||
|
|
||||||
|
inline nxgl_coord_t getStringWidth(FAR const CNxString *text,
|
||||||
|
int startIndex, int length) const
|
||||||
|
{
|
||||||
|
return getStringWidth(*text, startIndex, length);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets font metrics for a particular character
|
* Gets font metrics for a particular character
|
||||||
*
|
*
|
||||||
|
@ -257,6 +257,11 @@ namespace NXWidgets
|
|||||||
|
|
||||||
void setText(const CNxString &text);
|
void setText(const CNxString &text);
|
||||||
|
|
||||||
|
inline void setText(FAR const CNxString *text)
|
||||||
|
{
|
||||||
|
setText(*text);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the text in the string.
|
* Set the text in the string.
|
||||||
*
|
*
|
||||||
@ -433,7 +438,7 @@ namespace NXWidgets
|
|||||||
* substring.
|
* substring.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
CNxString *subString(int startIndex) const;
|
FAR CNxString *subString(int startIndex) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a substring from this string. It is the responsibility of the
|
* Get a substring from this string. It is the responsibility of the
|
||||||
@ -445,7 +450,7 @@ namespace NXWidgets
|
|||||||
* substring.
|
* substring.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
CNxString *subString(int startIndex, int length) const;
|
FAR CNxString *subString(int startIndex, int length) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Overloaded assignment operator. Copies the data within the argument
|
* Overloaded assignment operator. Copies the data within the argument
|
||||||
|
@ -102,16 +102,6 @@ namespace Twm4Nx
|
|||||||
|
|
||||||
bool createBackgroundImage(FAR const struct NXWidgets::SRlePaletteBitmap *sbitmap);
|
bool createBackgroundImage(FAR const struct NXWidgets::SRlePaletteBitmap *sbitmap);
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle the background window redraw.
|
|
||||||
*
|
|
||||||
* @param nxRect The region in the window to be redrawn
|
|
||||||
* @param more More redraw requests will follow
|
|
||||||
* @return true on success
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool redrawBackgroundWindow(FAR const struct nxgl_rect_s *rect, bool more);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* CBackground Constructor
|
* CBackground Constructor
|
||||||
@ -157,6 +147,16 @@ namespace Twm4Nx
|
|||||||
|
|
||||||
void getDisplaySize(FAR struct nxgl_size_s &size);
|
void getDisplaySize(FAR struct nxgl_size_s &size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle the background window redraw.
|
||||||
|
*
|
||||||
|
* @param nxRect The region in the window to be redrawn
|
||||||
|
* @param more More redraw requests will follow
|
||||||
|
* @return true on success
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool redrawBackgroundWindow(FAR const struct nxgl_rect_s *rect, bool more);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle EVENT_BACKGROUND events.
|
* Handle EVENT_BACKGROUND events.
|
||||||
*
|
*
|
||||||
|
@ -76,7 +76,8 @@ namespace NXWidgets
|
|||||||
|
|
||||||
namespace Twm4Nx
|
namespace Twm4Nx
|
||||||
{
|
{
|
||||||
class FAR CTwm4Nx; // Forward reference
|
class CTwm4Nx; // Forward reference
|
||||||
|
class CWindow; // Forward reference
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Container class that holds the Icon image and table widgets
|
* Container class that holds the Icon image and table widgets
|
||||||
@ -87,6 +88,7 @@ namespace Twm4Nx
|
|||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
FAR CTwm4Nx *m_twm4nx; /**< Cached Twm4Nx session */
|
FAR CTwm4Nx *m_twm4nx; /**< Cached Twm4Nx session */
|
||||||
|
FAR CWindow *m_parent; /**< The parent window (for de-iconify) */
|
||||||
mqd_t m_eventq; /**< NxWidget event message queue */
|
mqd_t m_eventq; /**< NxWidget event message queue */
|
||||||
FAR NXWidgets::CWidgetControl *m_widgetControl; /**< The controlling widget */
|
FAR NXWidgets::CWidgetControl *m_widgetControl; /**< The controlling widget */
|
||||||
|
|
||||||
@ -96,6 +98,7 @@ namespace Twm4Nx
|
|||||||
struct nxgl_point_s m_dragOffset; /**< Offset from mouse to window origin */
|
struct nxgl_point_s m_dragOffset; /**< Offset from mouse to window origin */
|
||||||
struct nxgl_size_s m_dragCSize; /**< The grab cursor size */
|
struct nxgl_size_s m_dragCSize; /**< The grab cursor size */
|
||||||
bool m_drag; /**< Drag in-progress */
|
bool m_drag; /**< Drag in-progress */
|
||||||
|
bool m_moved; /**< Icon has been moved */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* After the widget has been grabbed, it may be dragged then dropped,
|
* After the widget has been grabbed, it may be dragged then dropped,
|
||||||
@ -225,12 +228,13 @@ namespace Twm4Nx
|
|||||||
* Perform widget initialization that could fail and so it not appropriate
|
* Perform widget initialization that could fail and so it not appropriate
|
||||||
* for the constructor
|
* for the constructor
|
||||||
*
|
*
|
||||||
|
* @param parent The parent window. Needed for de-iconification.
|
||||||
* @param ibitmap The bitmap image representing the icon
|
* @param ibitmap The bitmap image representing the icon
|
||||||
* @param title The icon title string
|
* @param title The icon title string
|
||||||
* @return True is returned if the widget is successfully initialized.
|
* @return True is returned if the widget is successfully initialized.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool initialize(FAR NXWidgets::IBitmap *ibitmap,
|
bool initialize(FAR CWindow *parent, FAR NXWidgets::IBitmap *ibitmap,
|
||||||
FAR const NXWidgets::CNxString &title);
|
FAR const NXWidgets::CNxString &title);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user