Fixed so tooltip window in the iconbar when the title changes.
This commit is contained in:
parent
05fa2be096
commit
c31638038a
8 changed files with 118 additions and 64 deletions
|
@ -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
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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_
|
||||
|
|
Loading…
Reference in a new issue