Fixed so tooltip window in the iconbar when the title changes.

This commit is contained in:
Henrik Kinnunen 2008-05-09 19:39:02 +02:00
parent 05fa2be096
commit c31638038a
8 changed files with 118 additions and 64 deletions

View file

@ -1,5 +1,8 @@
(Format: Year/Month/Day)
Changes for 1.0.1:
Changes for 1.1
*08/05/09:
* Made tooltip in toolbar update when the title changes (Henrik)
Tooltip.cc/hh, Screen.cc/cc, OSDWindow.hh
*08/05/05:
* Add tooltips for iconbar buttons (thanks Matteo Galiazzo)
TooltipWindow.cc/hh

View file

@ -55,6 +55,7 @@ IconButton::IconButton(const FbTk::FbWindow &parent,
ExposureMask |EnterWindowMask | LeaveWindowMask |
ButtonPressMask | ButtonReleaseMask),
m_use_pixmap(true),
m_has_tooltip(false),
m_theme(win, focused_theme, unfocused_theme),
m_pm(win.screen().imageControl()) {
@ -81,16 +82,12 @@ void IconButton::exposeEvent(XExposeEvent &event) {
}
void IconButton::enterNotifyEvent(XCrossingEvent &ev) {
int xoffset = 1;
if (m_icon_pixmap.drawable() != 0)
xoffset = m_icon_window.x() + m_icon_window.width() + 1;
if (FbTk::TextButton::textExceeds(xoffset))
m_win.screen().showTooltip(m_win.title());
m_has_tooltip = true;
showTooltip();
}
void IconButton::leaveNotifyEvent(XCrossingEvent &ev) {
m_has_tooltip = false;
m_win.screen().hideTooltip();
}
@ -113,6 +110,15 @@ void IconButton::resize(unsigned int width, unsigned int height) {
}
}
void IconButton::showTooltip() {
int xoffset = 1;
if (m_icon_pixmap.drawable() != 0)
xoffset = m_icon_window.x() + m_icon_window.width() + 1;
if (FbTk::TextButton::textExceeds(xoffset))
m_win.screen().showTooltip(m_win.title());
}
void IconButton::clear() {
setupWindow();
}
@ -230,6 +236,15 @@ void IconButton::update(FbTk::Subject *subj) {
} else {
m_icon_window.clear();
}
// if the title was changed AND the tooltip window is visible AND
// we have had an enter notify event ( without the leave notify )
// update the text inside it
if (subj == &m_win.titleSig() &&
m_has_tooltip &&
m_win.screen().tooltipWindow().isVisible()) {
m_win.screen().tooltipWindow().updateText(m_win.title());
}
}
void IconButton::setupWindow() {

View file

@ -69,13 +69,16 @@ protected:
void drawText(int x, int y, FbTk::FbDrawable *drawable_override);
private:
void setupWindow();
void showTooltip();
Focusable &m_win;
FbTk::FbWindow m_icon_window;
FbTk::FbPixmap m_icon_pixmap;
FbTk::FbPixmap m_icon_mask;
bool m_use_pixmap;
/// whether or not this instance has the tooltip attention
/// i.e if it got enter notify
bool m_has_tooltip;
FocusableTheme<IconbarTheme> m_theme;
// cached pixmaps
FbTk::CachedPixmap m_pm;

View file

@ -46,8 +46,15 @@ public:
void hide();
bool isVisible() const { return m_visible; }
BScreen &screen() const { return m_screen; }
FbTk::ThemeProxy<FbWinFrameTheme> &theme() { return m_theme; }
protected:
/// Force visible status, use with care.
void setVisible(bool visible) {
m_visible = visible;
}
private:
void show();
BScreen &m_screen;

View file

@ -342,9 +342,9 @@ BScreen::BScreen(FbTk::ResourceManager &rm,
m_pressed_winbutton_theme(new WinButtonTheme(scrn, ".pressed", ".Pressed", *m_focused_windowtheme)),
m_menutheme(new FbTk::MenuTheme(scrn)),
m_root_window(scrn),
m_geom_window(m_root_window, *this, *m_focused_windowtheme),
m_pos_window(m_root_window, *this, *m_focused_windowtheme),
m_tooltip_window(m_root_window, *this, *m_focused_windowtheme),
m_geom_window(new OSDWindow(m_root_window, *this, *m_focused_windowtheme)),
m_pos_window(new OSDWindow(m_root_window, *this, *m_focused_windowtheme)),
m_tooltip_window(new TooltipWindow(m_root_window, *this, *m_focused_windowtheme)),
m_dummy_window(scrn, -1, -1, 1, 1, 0, true, false, CopyFromParent,
InputOnly),
resource(rm, screenname, altscreenname),
@ -486,7 +486,7 @@ BScreen::BScreen(FbTk::ResourceManager &rm,
renderGeomWindow();
renderPosWindow();
m_tooltip_window.setDelay(*resource.tooltip_delay);
m_tooltip_window->setDelay(*resource.tooltip_delay);
// setup workspaces and workspace menu
int nr_ws = *resource.workspaces;
@ -1827,12 +1827,12 @@ void BScreen::showPosition(int x, int y) {
char label[256];
sprintf(label, "X:%5d x Y:%5d", x, y);
m_pos_window.showText(label);
m_pos_window->showText(label);
}
void BScreen::hidePosition() {
m_pos_window.hide();
m_pos_window->hide();
}
// can be negative when base_width/height > min_width/height
@ -1848,23 +1848,23 @@ void BScreen::showGeometry(int gx, int gy) {
"W: %4d x H: %4d",
"Format for width and height window, %4d for width, and %4d for height").c_str(),
gx, gy);
m_geom_window.showText(label);
m_geom_window->showText(label);
}
void BScreen::showTooltip(const std::string &text) {
if (*resource.tooltip_delay >= 0)
m_tooltip_window.showText(text);
m_tooltip_window->showText(text);
}
void BScreen::hideTooltip() {
if (*resource.tooltip_delay >= 0)
m_tooltip_window.hide();
m_tooltip_window->hide();
}
void BScreen::hideGeometry() {
m_geom_window.hide();
m_geom_window->hide();
}
void BScreen::setLayer(FbTk::XLayerItem &item, int layernum) {
@ -1912,14 +1912,14 @@ void BScreen::renderGeomWindow() {
_FB_XTEXT(Screen, GeometrySpacing,
"W: %04d x H: %04d", "Representative maximum sized text for width and height dialog").c_str(),
0, 0);
m_geom_window.resize(label);
m_geom_window.reconfigTheme();
m_geom_window->resize(label);
m_geom_window->reconfigTheme();
}
void BScreen::renderPosWindow() {
m_pos_window.resize("0:00000 x 0:00000");
m_pos_window.reconfigTheme();
m_pos_window->resize("0:00000 x 0:00000");
m_pos_window->reconfigTheme();
}
void BScreen::updateSize() {

View file

@ -64,6 +64,8 @@ class Toolbar;
class HeadArea;
class FocusControl;
class ScreenPlacement;
class TooltipWindow;
class OSDWindow;
namespace FbTk {
class Menu;
@ -73,6 +75,7 @@ class FbWindow;
class Subject;
}
/// Handles screen connection, screen clients and workspaces
/**
Create workspaces, handles switching between workspaces and windows
@ -389,10 +392,14 @@ public:
/// show geomentry with "width x height"-text, not size of window
void showGeometry(int width, int height);
void hideGeometry();
/// @param text the text to be displayed in the tooltip window
void showTooltip(const std::string &text);
/// Hides the tooltip window
void hideTooltip();
TooltipWindow& tooltipWindow() { return *m_tooltip_window; }
void setLayer(FbTk::XLayerItem &item, int layernum);
// remove? no, items are never removed from their layer until they die
@ -538,8 +545,8 @@ private:
std::auto_ptr<RootTheme> m_root_theme;
FbRootWindow m_root_window;
OSDWindow m_geom_window, m_pos_window;
TooltipWindow m_tooltip_window;
std::auto_ptr<OSDWindow> m_geom_window, m_pos_window;
std::auto_ptr<TooltipWindow> m_tooltip_window;
FbTk::FbWindow m_dummy_window;
struct ScreenResource {

View file

@ -28,33 +28,35 @@
TooltipWindow::TooltipWindow(const FbTk::FbWindow &parent, BScreen &screen,
FbTk::ThemeProxy<FbWinFrameTheme> &theme):
OSDWindow(parent, screen, theme),
delay(-1) {
m_delay(-1) {
FbTk::RefCount<FbTk::Command<void> > raisecmd(new FbTk::SimpleCommand<TooltipWindow>(*this, &TooltipWindow::raiseTooltip));
timer.setCommand(raisecmd);
timer.fireOnce(true);
FbTk::RefCount<FbTk::Command<void> >
raisecmd(new FbTk::SimpleCommand<TooltipWindow>(*this,
&TooltipWindow::raiseTooltip));
m_timer.setCommand(raisecmd);
m_timer.fireOnce(true);
}
void TooltipWindow::showText(const std::string &text) {
lastText = text.c_str();
if (delay == 0)
m_lastText = text;
if (m_delay == 0)
raiseTooltip();
else
timer.start();
m_timer.start();
}
void TooltipWindow::raiseTooltip() {
if (lastText.size() == 0)
if (m_lastText.empty())
return;
resize(lastText);
resize(m_lastText);
reconfigTheme();
int h = m_theme->font().height() + m_theme->bevelWidth() * 2;
int w = m_theme->font().textWidth(lastText, lastText.size()) + m_theme->bevelWidth() * 2;
int h = theme()->font().height() + theme()->bevelWidth() * 2;
int w = theme()->font().textWidth(m_lastText, m_lastText.size()) + theme()->bevelWidth() * 2;
Window root_ret; // not used
Window window_ret; // not used
@ -62,13 +64,13 @@ void TooltipWindow::raiseTooltip() {
int wx, wy; // not used
unsigned int mask; // not used
XQueryPointer(display(), m_screen.rootWindow().window(),
XQueryPointer(display(), screen().rootWindow().window(),
&root_ret, &window_ret, &rx, &ry, &wx, &wy, &mask);
int head = m_screen.getHead(rx, ry);
int head_top = m_screen.getHeadY(head);
int head_left = m_screen.getHeadX(head);
int head_right = head_left + m_screen.getHeadWidth(head);
int head = screen().getHead(rx, ry);
int head_top = screen().getHeadY(head);
int head_left = screen().getHeadX(head);
int head_right = head_left + screen().getHeadWidth(head);
// center the mouse horizontally
rx -= w/2;
@ -88,22 +90,27 @@ void TooltipWindow::raiseTooltip() {
show();
clear();
m_theme->font().drawText(*this, m_screen.screenNumber(),
m_theme->iconbarTheme().text().textGC(), lastText,
lastText.size(), m_theme->bevelWidth(),
m_theme->bevelWidth() + m_theme->font().ascent());
theme()->font().drawText(*this, screen().screenNumber(),
theme()->iconbarTheme().text().textGC(),
m_lastText, m_lastText.size(),
theme()->bevelWidth(),
theme()->bevelWidth() + theme()->font().ascent());
}
void TooltipWindow::updateText(const std::string &text) {
m_lastText = text;
raiseTooltip();
}
void TooltipWindow::show() {
if (m_visible)
if (isVisible())
return;
m_visible = true;
setVisible(true);
raise();
FbTk::FbWindow::show();
}
void TooltipWindow::hide() {
timer.stop();
m_timer.stop();
OSDWindow::hide();
}

View file

@ -17,9 +17,10 @@
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.#ifndef TOOLTIPWINDOW_HH_
#ifndef TOOLTIPWINDOW_HH_
#define TOOLTIPWINDOW_HH_
// DEALINGS IN THE SOFTWARE.
#ifndef TOOLTIPWINDOW_HH
#define TOOLTIPWINDOW_HH
#include "OSDWindow.hh"
#include "FbTk/Command.hh"
@ -27,27 +28,38 @@
#include "FbTk/Timer.hh"
#include "FbTk/SimpleCommand.hh"
/**
* Displays a tooltip window
*/
class TooltipWindow : public OSDWindow {
public:
TooltipWindow(const FbTk::FbWindow &parent, BScreen &screen,
FbTk::ThemeProxy<FbWinFrameTheme> &theme);
/**
* Sets the text in the window and starts the display timer.
* @param text the text to show in the window.
*/
void showText(const std::string &text);
void setDelay(int iDelay) {
delay = iDelay;
timer.setTimeout(delay);
/// updates the text directly without any delay
void updateText(const std::string &text);
/// Sets the delay before the window pops up
void setDelay(int delay) {
m_delay = delay;
m_timer.setTimeout(delay);
}
void hide() ;
void hide();
private:
void raiseTooltip();
void show();
int delay;
std::string lastText;
FbTk::Timer timer;
void show();
int m_delay; ///< delay time for the timer
std::string m_lastText; ///< last text to be displayed
FbTk::Timer m_timer; ///< delay timer before the tooltip will show
};
#endif /*TOOLTIPWINDOW_HH_*/
#endif // TOOLTIPWINDOW_HH_