added initial tool tip functionality

removed duplicate _editMode in DataGridWidget
This commit is contained in:
thrust26 2020-11-16 12:26:01 +01:00
parent 7144ff4964
commit 120c306286
10 changed files with 147 additions and 26 deletions

View File

@ -45,6 +45,7 @@ DataGridWidget::DataGridWidget(GuiObject* boss, const GUI::Font& font,
_base(base) _base(base)
{ {
_flags = Widget::FLAG_ENABLED | Widget::FLAG_RETAIN_FOCUS | Widget::FLAG_WANTS_RAWDATA; _flags = Widget::FLAG_ENABLED | Widget::FLAG_RETAIN_FOCUS | Widget::FLAG_WANTS_RAWDATA;
_editMode = false;
// Make sure all lists contain some default values // Make sure all lists contain some default values
_hiliteList.clear(); _hiliteList.clear();

View File

@ -128,7 +128,6 @@ class DataGridWidget : public EditableWidget
BoolArray _changedList; BoolArray _changedList;
BoolArray _hiliteList; BoolArray _hiliteList;
bool _editMode{false};
int _selectedItem{0}; int _selectedItem{0};
StellaKey _currentKeyDown{KBDK_UNKNOWN}; StellaKey _currentKeyDown{KBDK_UNKNOWN};
string _backupString; string _backupString;

View File

@ -27,6 +27,7 @@
#include "Dialog.hxx" #include "Dialog.hxx"
#include "Widget.hxx" #include "Widget.hxx"
#include "TabWidget.hxx" #include "TabWidget.hxx"
#include "ToolTip.hxx"
#include "ContextMenu.hxx" #include "ContextMenu.hxx"
#include "PopUpWidget.hxx" #include "PopUpWidget.hxx"
@ -65,6 +66,8 @@ Dialog::Dialog(OSystem& instance, DialogContainer& parent, const GUI::Font& font
attr.blending = true; attr.blending = true;
attr.blendalpha = 25; // darken background dialogs by 25% attr.blendalpha = 25; // darken background dialogs by 25%
_shadeSurface->applyAttributes(); _shadeSurface->applyAttributes();
_toolTip = make_unique<ToolTip>(instance, *this, font);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -266,6 +269,8 @@ void Dialog::render()
_shadeSurface->setDstRect(_surface->dstRect()); _shadeSurface->setDstRect(_surface->dstRect());
_shadeSurface->render(); _shadeSurface->render();
} }
_toolTip->render();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -588,6 +593,9 @@ void Dialog::handleMouseMoved(int x, int y)
{ {
Widget* w; Widget* w;
// Update mouse coordinates for tooltips
_toolTip->update(x, y);
if(_focusedWidget && !_dragWidget) if(_focusedWidget && !_dragWidget)
{ {
w = _focusedWidget; w = _focusedWidget;

View File

@ -26,6 +26,7 @@ class OSystem;
class DialogContainer; class DialogContainer;
class TabWidget; class TabWidget;
class CommandSender; class CommandSender;
class ToolTip;
#include "Stack.hxx" #include "Stack.hxx"
#include "Widget.hxx" #include "Widget.hxx"
@ -122,6 +123,7 @@ class Dialog : public GuiObject
*/ */
bool shouldResize(uInt32& w, uInt32& h) const; bool shouldResize(uInt32& w, uInt32& h) const;
ToolTip& tooltip() { return *_toolTip; };
//bool enableToolTip(); //bool enableToolTip();
//void showToolTip(int x, int y); //void showToolTip(int x, int y);
//void hideToolTip(); //void hideToolTip();
@ -203,7 +205,7 @@ class Dialog : public GuiObject
string _title; string _title;
int _th{0}; int _th{0};
int _layer{0}; int _layer{0};
int _toolTipTimer{0}; unique_ptr<ToolTip> _toolTip;
Common::FixedStack<shared_ptr<FBSurface>> mySurfaceStack; Common::FixedStack<shared_ptr<FBSurface>> mySurfaceStack;

View File

@ -18,6 +18,7 @@
#include "OSystem.hxx" #include "OSystem.hxx"
#include "FBSurface.hxx" #include "FBSurface.hxx"
#include "Dialog.hxx" #include "Dialog.hxx"
#include "ToolTip.hxx"
#include "Font.hxx" #include "Font.hxx"
#include "EditTextWidget.hxx" #include "EditTextWidget.hxx"

View File

@ -120,12 +120,14 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent,
// Show the filter input field // Show the filter input field
xpos -= fwidth + LBL_GAP; xpos -= fwidth + LBL_GAP;
myPattern = new EditTextWidget(this, font, xpos, ypos - 2, fwidth, lineHeight, ""); myPattern = new EditTextWidget(this, font, xpos, ypos - 2, fwidth, lineHeight, "");
myPattern->setToolTip("Enter a filter text to reduce file list.");
// Show the "Filter" label // Show the "Filter" label
xpos -= lwidth3 + LBL_GAP; xpos -= lwidth3 + LBL_GAP;
new StaticTextWidget(this, font, xpos, ypos, lblFilter); new StaticTextWidget(this, font, xpos, ypos, lblFilter);
// Show the checkbox for all files // Show the checkbox for all files
xpos -= lwidth2 + LBL_GAP * 3; xpos -= lwidth2 + LBL_GAP * 3;
myAllFiles = new CheckboxWidget(this, font, xpos, ypos, lblAllFiles, kAllfilesCmd); myAllFiles = new CheckboxWidget(this, font, xpos, ypos, lblAllFiles, kAllfilesCmd);
myAllFiles->setToolTip("Uncheck to show ROM files only.");
wid.push_back(myAllFiles); wid.push_back(myAllFiles);
wid.push_back(myPattern); wid.push_back(myPattern);
} }
@ -178,6 +180,7 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent,
#ifndef BSPF_MACOS #ifndef BSPF_MACOS
myStartButton = new ButtonWidget(this, font, xpos, ypos, (buttonWidth + 0) / 4, buttonHeight, myStartButton = new ButtonWidget(this, font, xpos, ypos, (buttonWidth + 0) / 4, buttonHeight,
"Select", kLoadROMCmd); "Select", kLoadROMCmd);
myStartButton->setToolTip("Start emulation of selected ROM.");
wid.push_back(myStartButton); wid.push_back(myStartButton);
xpos += (buttonWidth + 0) / 4 + BUTTON_GAP; xpos += (buttonWidth + 0) / 4 + BUTTON_GAP;

View File

@ -16,25 +16,80 @@
//============================================================================ //============================================================================
#include "OSystem.hxx" #include "OSystem.hxx"
#include "FrameBuffer.hxx"
#include "FBSurface.hxx"
#include "Font.hxx" #include "Font.hxx"
#include "Dialog.hxx" #include "Dialog.hxx"
#include "DialogContainer.hxx" #include "Widget.hxx"
#include "ToolTip.hxx" #include "ToolTip.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ToolTip::ToolTip(OSystem& instance, DialogContainer& parent, ToolTip::ToolTip(OSystem& instance, Dialog& dialog, const GUI::Font& font)
const GUI::Font& font) : myDialog(dialog),
: Dialog(instance, parent, font) myFont(font)
{ {
const int lineHeight = font.getLineHeight(), const int fontWidth = font.getMaxCharWidth(),
fontWidth = font.getMaxCharWidth(), fontHeight = font.getFontHeight();
fontHeight = font.getFontHeight(),
buttonWidth = font.getStringWidth("Previous") + fontWidth * 2.5, myTextXOfs = fontHeight < 24 ? 5 : 8; //3 : 5;
buttonHeight = font.getLineHeight() * 1.25; myWidth = myTextXOfs * 2 + fontWidth * MAX_LEN;
const int VBORDER = fontHeight / 2; myHeight = fontHeight + TEXT_Y_OFS * 2;
const int HBORDER = fontWidth * 1.25; mySurface = instance.frameBuffer().allocateSurface(myWidth, myHeight);
const int VGAP = fontHeight / 4;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ToolTip::request(Widget* widget)
{
if(myWidget != widget)
{
release();
}
if(myTimer == DELAY_TIME)
{
string text = widget->getToolTip();
int width = std::min(myWidth, myFont.getStringWidth(text) + myTextXOfs * 2);
int yOffset = 20; // TODO: query cursor height
myWidget = widget;
// TODO: limit to app or screen size
mySurface->setSrcSize(width, myHeight);
mySurface->setDstSize(width, myHeight);
mySurface->setDstPos(myPos.x, myPos.y + yOffset);
mySurface->frameRect(0, 0, width, myHeight, kColor);
mySurface->fillRect(1, 1, width - 2, myHeight - 2, kWidColor);
mySurface->drawString(myFont, text, myTextXOfs, TEXT_Y_OFS,
width - myTextXOfs * 2, myHeight - TEXT_Y_OFS * 2, kTextColor);
myDialog.setDirtyChain();
}
myTimer++;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ToolTip::release()
{
if(myWidget != nullptr)
{
myTimer = 0;
myWidget = nullptr;
myDialog.setDirtyChain();
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ToolTip::render()
{
if(myWidget != nullptr)
mySurface->render();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ToolTip::update(int x, int y)
{
if(myWidget != nullptr && x != myPos.x || y != myPos.y)
release();
myPos.x = x;
myPos.y = y;
}

View File

@ -18,22 +18,62 @@
#ifndef TOOL_TIP_HXX #ifndef TOOL_TIP_HXX
#define TOOL_TIP_HXX #define TOOL_TIP_HXX
class OSystem;
class DialogContainer;
/** /**
* Class for providing tooltip functionality * Class for providing tooltip functionality
* *
* @author Thomas Jentzsch * @author Thomas Jentzsch
*/ */
class ToolTip : public Dialog
class OSystem;
class FBSurface;
class Widget;
#include "Rect.hxx"
class ToolTip
{ {
public: public:
// Maximum tooltip length
static constexpr int MAX_LEN = 60;
public: ToolTip(OSystem& instance, Dialog& dialog, const GUI::Font& font);
ToolTip(OSystem& instance, DialogContainer& parent, ~ToolTip() = default;
const GUI::Font& font);
~ToolTip() override = default; /**
Request a tooltip display
*/
void request(Widget* widget);
/**
Hide an existing tooltip (if displayed)
*/
void release();
/**
Update with current mouse position
*/
void update(int x, int y);
/*
Render the tooltip
*/
void render();
private:
static constexpr uInt32 DELAY_TIME = 45; // display delay
static constexpr int TEXT_Y_OFS = 2;
const GUI::Font& myFont;
Dialog& myDialog;
Widget* myWidget{nullptr};
uInt32 myTimer{0};
Common::Point myPos;
int myWidth{0};
int myHeight{0};
int myTextXOfs{0};
shared_ptr<FBSurface> mySurface;
}; };
#endif #endif

View File

@ -21,6 +21,7 @@
#include "bspf.hxx" #include "bspf.hxx"
#include "Command.hxx" #include "Command.hxx"
#include "Dialog.hxx" #include "Dialog.hxx"
#include "ToolTip.hxx"
#include "FBSurface.hxx" #include "FBSurface.hxx"
#include "GuiObject.hxx" #include "GuiObject.hxx"
#include "OSystem.hxx" #include "OSystem.hxx"
@ -74,7 +75,8 @@ void Widget::tick()
{ {
if(isEnabled()) if(isEnabled())
{ {
//if(_hasFocus && hasToolTip()) if(isHighlighted() && hasToolTip())
dialog().tooltip().request(this);
//{ //{
// if(dialog().enableToolTip()) // if(dialog().enableToolTip())
// dialog().showToolTip(10, 10); // dialog().showToolTip(10, 10);
@ -208,6 +210,14 @@ void Widget::setEnabled(bool e)
else clearFlags(Widget::FLAG_ENABLED); else clearFlags(Widget::FLAG_ENABLED);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Widget::setToolTip(const string& text)
{
assert(text.length() <= ToolTip::MAX_LEN);
_toolTipText = text;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Widget* Widget::findWidgetInChain(Widget* w, int x, int y) Widget* Widget::findWidgetInChain(Widget* w, int x, int y)
{ {

View File

@ -87,6 +87,7 @@ class Widget : public GuiObject
bool isEnabled() const { return _flags & FLAG_ENABLED; } bool isEnabled() const { return _flags & FLAG_ENABLED; }
bool isVisible() const override { return !(_flags & FLAG_INVISIBLE); } bool isVisible() const override { return !(_flags & FLAG_INVISIBLE); }
bool isHighlighted() const { return _flags & FLAG_HILITED; }
virtual bool wantsFocus() const { return _flags & FLAG_RETAIN_FOCUS; } virtual bool wantsFocus() const { return _flags & FLAG_RETAIN_FOCUS; }
bool wantsTab() const { return _flags & FLAG_WANTS_TAB; } bool wantsTab() const { return _flags & FLAG_WANTS_TAB; }
bool wantsRaw() const { return _flags & FLAG_WANTS_RAWDATA; } bool wantsRaw() const { return _flags & FLAG_WANTS_RAWDATA; }
@ -102,7 +103,8 @@ class Widget : public GuiObject
void setBGColorHi(ColorId color) { _bgcolorhi = color; setDirty(); } void setBGColorHi(ColorId color) { _bgcolorhi = color; setDirty(); }
void setShadowColor(ColorId color) { _shadowcolor = color; setDirty(); } void setShadowColor(ColorId color) { _shadowcolor = color; setDirty(); }
void setToolTip(const string& text) { _toolTipText = text; } void setToolTip(const string& text);
const string& getToolTip() const { return _toolTipText; }
bool hasToolTip() const { return !_toolTipText.empty(); } bool hasToolTip() const { return !_toolTipText.empty(); }
virtual void loadConfig() { } virtual void loadConfig() { }