From 15379c61fe569416d4c69cb727772130af18553c Mon Sep 17 00:00:00 2001 From: Markus Gans Date: Mon, 28 Sep 2015 04:31:29 +0200 Subject: [PATCH] Fixed setPos in FWidget --- src/fmenu.cpp | 32 +++++++++++-------- src/fmenu.h | 1 - src/fmenubar.cpp | 76 ++++++++++++++++++++++++++++++++-------------- src/fmenubar.h | 8 +++-- src/fmenuitem.cpp | 75 +++++++++++++++++++++++++++++++++++++++++++-- src/fmenuitem.h | 14 +++++++++ src/fmenulist.h | 6 ---- src/fstatusbar.cpp | 29 ++++++++++-------- src/fwidget.cpp | 12 +++++--- 9 files changed, 190 insertions(+), 63 deletions(-) diff --git a/src/fmenu.cpp b/src/fmenu.cpp index 27d64743..8cc10907 100644 --- a/src/fmenu.cpp +++ b/src/fmenu.cpp @@ -13,7 +13,6 @@ FMenu::FMenu(FWidget* parent) : FWindow(parent) , item(0) , super_menu(0) - , next_item_pos(1,1) , maxItemWidth(0) , current(0) , mouse_down(false) @@ -26,7 +25,6 @@ FMenu::FMenu (FString& txt, FWidget* parent) : FWindow(parent) , item(0) , super_menu(0) - , next_item_pos(1,1) , maxItemWidth(0) , current(0) , mouse_down(false) @@ -40,7 +38,6 @@ FMenu::FMenu (const std::string& txt, FWidget* parent) : FWindow(parent) , item(0) , super_menu(0) - , next_item_pos(1,1) , maxItemWidth(0) , current(0) , mouse_down(false) @@ -54,7 +51,6 @@ FMenu::FMenu (const char* txt, FWidget* parent) : FWindow(parent) , item(0) , super_menu(0) - , next_item_pos(1,1) , maxItemWidth(0) , current(0) , mouse_down(false) @@ -122,6 +118,7 @@ void FMenu::init() //---------------------------------------------------------------------- void FMenu::menu_dimension() { + int item_X, item_Y; std::vector::const_iterator iter, end; iter = itemlist.begin(); end = itemlist.end(); @@ -130,18 +127,29 @@ void FMenu::menu_dimension() // find the max item width while ( iter != end ) { - FString item_text = (*iter)->getText(); - uInt len = item_text.getLength(); + uInt item_width = (*iter)->getTextLength() + 2; - if ( item_text.includes(L'&') ) // item has a hotkey '&' - len--; + if ( item_width > maxItemWidth ) + maxItemWidth = item_width; - if ( len > maxItemWidth ) - maxItemWidth = len; ++iter; } - setGeometry (xpos, ypos, int(maxItemWidth + 4), int(count() + 2)); + // set widget geometry + setGeometry (xpos, ypos, int(maxItemWidth + 2), int(count() + 2)); + + // set geometry of all items + iter = itemlist.begin(); + item_X = 1; + item_Y = 1; + + while ( iter != end ) + { + (*iter)->setGeometry (item_X, item_Y, maxItemWidth, 1); + item_Y++; + + ++iter; + } } //---------------------------------------------------------------------- @@ -350,7 +358,7 @@ void FMenu::drawItems() if ( is_Selected ) { - for (uInt i=uInt(to_char); i <= maxItemWidth; i++) + for (uInt i=uInt(to_char); i < maxItemWidth-1; i++) print (' '); } diff --git a/src/fmenu.h b/src/fmenu.h index 3a13bd12..4ef0a566 100644 --- a/src/fmenu.h +++ b/src/fmenu.h @@ -47,7 +47,6 @@ class FMenu : public FWindow, public FMenuList private: FMenuItem* item; FMenuList* super_menu; - FPoint next_item_pos; uInt maxItemWidth; int current; bool mouse_down; diff --git a/src/fmenubar.cpp b/src/fmenubar.cpp index f16d2008..ccf2a201 100644 --- a/src/fmenubar.cpp +++ b/src/fmenubar.cpp @@ -2,7 +2,7 @@ // Provides: class FMenuBar #include "fmenubar.h" - +#include "fmessagebox.h" //---------------------------------------------------------------------- // class FMenuBar //---------------------------------------------------------------------- @@ -12,7 +12,6 @@ FMenuBar::FMenuBar(FWidget* parent) : FWindow(parent) , mouse_down(false) - , next_item_pos(1,1) , x(-1) { init(); @@ -53,6 +52,34 @@ void FMenuBar::init() unsetFocusable(); } +//---------------------------------------------------------------------- +void FMenuBar::menu_dimension() +{ + int item_X = 1; + int item_Y = 1; + std::vector::const_iterator begin, end, iter; + iter = itemlist.begin(); + end = itemlist.end(); + + // find the max item width + while ( iter != end ) + { + uInt len = (*iter)->getTextLength(); + int item_width = int(len + 2); + + // set item geometry + (*iter)->setGeometry (item_X, item_Y, item_width, 1, false); + + // set menu position + if ( (*iter)->hasMenu() ) + (*iter)->getMenu()->setPos (item_X, item_Y, false); + + item_X += item_width; + + ++iter; + } +} + //---------------------------------------------------------------------- bool FMenuBar::isMenu (FMenuItem* mi) const { @@ -86,6 +113,9 @@ void FMenuBar::draw() xmin = ymin = 1; height = 1; xpos = 1; + + menu_dimension(); + drawItems(); } @@ -121,6 +151,7 @@ void FMenuBar::drawItems() uInt txt_length; int hotkeypos, to_char; + is_Active = (*iter)->isActivated(); is_Selected = (*iter)->isSelected(); is_NoUnderline = (((*iter)->getFlags() & NO_UNDERLINE) != 0); @@ -255,18 +286,17 @@ void FMenuBar::onMouseDown (FMouseEvent* ev) iter = itemlist.begin(); end = itemlist.end(); - +//FMessageBox::info (this, "Info", FString().sprintf("local(%d,%d) global(%d,%d)", ev->getX(),ev->getY(),ev->getGlobalX(), ev->getGlobalY())); // + #include while ( iter != end ) { int x1, x2, mouse_x, mouse_y, txt_length; x1 = X; - txt_length = int((*iter)->getText().getLength()); - if ( (*iter)->hasHotkey() ) - txt_length--; - x2 = x1 + txt_length; - mouse_x = ev->getX(); - mouse_y = ev->getY(); + txt_length = int((*iter)->getTextLength()); + + x2 = x1 + txt_length + 1; + mouse_x = ev->getGlobalX(); + mouse_y = ev->getGlobalY(); if ( mouse_x >= x1 && mouse_x <= x2 @@ -306,16 +336,16 @@ void FMenuBar::onMouseUp (FMouseEvent* ev) while ( iter != end ) { - int x1 = X; - int txt_length = int((*iter)->getText().getLength()); - if ( (*iter)->hasHotkey() ) - txt_length--; - int x2 = x1 + txt_length; + int x1, x2, txt_length; + + x1 = X; + txt_length = int((*iter)->getTextLength()); + x2 = x1 + txt_length + 1; if ( (*iter)->isSelected() ) { - int mouse_x = ev->getX(); - int mouse_y = ev->getY(); + int mouse_x = ev->getGlobalX(); + int mouse_y = ev->getGlobalY(); if ( mouse_x < x1 || mouse_x > x2 || mouse_y != 1 ) (*iter)->unsetSelected(); else @@ -348,14 +378,14 @@ void FMenuBar::onMouseMove (FMouseEvent* ev) while ( iter != end ) { - int x1 = X; - int txt_length = int((*iter)->getText().getLength()); - if ( (*iter)->hasHotkey() ) - txt_length--; - int x2 = x1 + txt_length; + int x1, x2, txt_length; - int mouse_x = ev->getX(); - int mouse_y = ev->getY(); + x1 = X; + txt_length = int((*iter)->getTextLength()); + x2 = x1 + txt_length + 1; + + int mouse_x = ev->getGlobalX(); + int mouse_y = ev->getGlobalY(); if ( mouse_x >= x1 && mouse_x <= x2 && mouse_y == 1 ) diff --git a/src/fmenubar.h b/src/fmenubar.h index 9a9a71e4..427dfe2a 100644 --- a/src/fmenubar.h +++ b/src/fmenubar.h @@ -30,8 +30,9 @@ #ifndef _FMENUBAR_H #define _FMENUBAR_H -#include "fwindow.h" #include "fmenulist.h" +#include "fmenu.h" +#include "fwindow.h" //---------------------------------------------------------------------- @@ -45,13 +46,13 @@ class FMenuBar : public FWindow, public FMenuList { private: bool mouse_down; - FPoint next_item_pos; int x; private: FMenuBar (const FMenuBar&); FMenuBar& operator = (const FMenuBar&); void init(); + void menu_dimension(); bool isMenu (FMenuItem*) const; int getHotkeyPos (wchar_t*&, wchar_t*&, uInt); void draw(); @@ -71,6 +72,9 @@ class FMenuBar : public FWindow, public FMenuList using FWidget::setGeometry; void setGeometry (int, int, int, int, bool = true); void cb_item_activated (FWidget*, void*); + + private: + friend class FMenuItem; }; #pragma pack(pop) diff --git a/src/fmenuitem.cpp b/src/fmenuitem.cpp index 7b41bc5f..1a07351c 100644 --- a/src/fmenuitem.cpp +++ b/src/fmenuitem.cpp @@ -92,7 +92,7 @@ void FMenuItem::init (FWidget* parent) hotkey = getHotkey(); if ( hotkey ) text_length--; - setGeometry (1,1,text_length+2,1); + setGeometry (1,1,text_length+2,1, false); if ( parent ) { @@ -100,19 +100,21 @@ void FMenuItem::init (FWidget* parent) { setSuperMenu( dynamic_cast(parent) ); superMenu()->insert(this); + dynamic_cast(parent)->menu_dimension(); //addAccelerator (item->getKey(), item); this->addCallback ( "activate", - _METHOD_CALLBACK (superMenu(), &FMenu::cb_menuitem_activated) + _METHOD_CALLBACK (superMenu(), &FMenuBar::cb_item_activated) ); } else if ( isMenu(parent) ) // Parent is menu { setSuperMenu( dynamic_cast(parent) ); superMenu()->insert(this); + //addAccelerator (item->getKey(), item); @@ -141,6 +143,12 @@ uChar FMenuItem::getHotkey() return 0; } +//---------------------------------------------------------------------- +bool FMenuItem::isMenuBar (FMenuList* ml) const +{ + return isMenuBar (dynamic_cast(ml)); +} + //---------------------------------------------------------------------- bool FMenuItem::isMenuBar (FWidget* w) const { @@ -148,6 +156,12 @@ bool FMenuItem::isMenuBar (FWidget* w) const , const_cast("FMenuBar") ) == 0 ); } +//---------------------------------------------------------------------- +bool FMenuItem::isMenu (FMenuList* ml) const +{ + return isMenu (dynamic_cast(ml)); +} + //---------------------------------------------------------------------- bool FMenuItem::isMenu (FWidget* w) const { @@ -193,6 +207,63 @@ void FMenuItem::onAccel (FAccelEvent* ev) } } +//---------------------------------------------------------------------- +void FMenuItem::onMouseDown (FMouseEvent* ev) +{ + const FPoint& p1 = ev->getPos(); + const FPoint& g = ev->getGlobalPos(); + FPoint p2(p1); + int b = ev->getButton(); + p2 = p1 + getPos() - FPoint(1,1); + ev = new FMouseEvent (MouseMove_Event, p2, g, b); + + if ( isMenu(super_menu) ) + dynamic_cast(super_menu)->onMouseDown(ev); + + if ( isMenuBar(super_menu) ) + dynamic_cast(super_menu)->onMouseDown(ev); + + delete ev; +} + +//---------------------------------------------------------------------- +void FMenuItem::onMouseUp (FMouseEvent* ev) +{ + const FPoint& p1 = ev->getPos(); + const FPoint& g = ev->getGlobalPos(); + FPoint p2(p1); + int b = ev->getButton(); + p2 = p1 + getPos() - FPoint(1,1); + ev = new FMouseEvent (MouseMove_Event, p2, g, b); + + if ( isMenu(super_menu) ) + dynamic_cast(super_menu)->onMouseUp(ev); + + if ( isMenuBar(super_menu) ) + dynamic_cast(super_menu)->onMouseUp(ev); + + delete ev; +} + +//---------------------------------------------------------------------- +void FMenuItem::onMouseMove (FMouseEvent* ev) +{ + const FPoint& p1 = ev->getPos(); + const FPoint& g = ev->getGlobalPos(); + FPoint p2(p1); + int b = ev->getButton(); + p2 = p1 + getPos() - FPoint(1,1); + ev = new FMouseEvent (MouseMove_Event, p2, g, b); + + if ( isMenu(super_menu) ) + dynamic_cast(super_menu)->onMouseMove(ev); + + if ( isMenuBar(super_menu) ) + dynamic_cast(super_menu)->onMouseMove(ev); + + delete ev; +} + //---------------------------------------------------------------------- void FMenuItem::setSelected() { diff --git a/src/fmenuitem.h b/src/fmenuitem.h index 2e72f977..10bbb316 100644 --- a/src/fmenuitem.h +++ b/src/fmenuitem.h @@ -59,7 +59,9 @@ class FMenuItem : public FWidget FMenuItem& operator = (const FMenuItem&); void init (FWidget*); uChar getHotkey(); + bool isMenuBar (FMenuList*) const; bool isMenuBar (FWidget*) const; + bool isMenu (FMenuList*) const; bool isMenu (FWidget*) const; FMenuList* superMenu() const; void setSuperMenu (FMenuList*); @@ -74,6 +76,9 @@ class FMenuItem : public FWidget virtual ~FMenuItem(); void onAccel (FAccelEvent*); + void onMouseDown (FMouseEvent*); + void onMouseUp (FMouseEvent*); + void onMouseMove (FMouseEvent*); FString getText() const; void setActive(); void unsetActive(); @@ -88,8 +93,10 @@ class FMenuItem : public FWidget void unsetChecked(); bool isChecked() const; bool hasHotkey() const; + FMenu* getMenu() const; void setMenu(FMenu*); bool hasMenu() const; + uInt getTextLength() const; void setText (FString&); void setText (const std::string&); void setText (const char*); @@ -154,6 +161,10 @@ inline bool FMenuItem::isChecked() const inline bool FMenuItem::hasHotkey() const { return bool(hotkey != 0); } +//---------------------------------------------------------------------- +inline FMenu* FMenuItem::getMenu() const +{ return menu; } + //---------------------------------------------------------------------- inline void FMenuItem::setMenu(FMenu* m) { menu = m; } @@ -162,5 +173,8 @@ inline void FMenuItem::setMenu(FMenu* m) inline bool FMenuItem::hasMenu() const { return bool(menu != 0); } +//---------------------------------------------------------------------- +inline uInt FMenuItem::getTextLength() const +{ return text_length; } #endif // _FMENUITEM_H diff --git a/src/fmenulist.h b/src/fmenulist.h index b393c002..496b34fd 100644 --- a/src/fmenulist.h +++ b/src/fmenulist.h @@ -16,12 +16,6 @@ #include "fwidget.h" /* -- FMenuBar muß die x + y Positionen des nächsten - einzufügenden FMenuItem kennen - -- FMenu muß die x + y Positionen des nächsten - einzufügenden FMenuItem kennen - ┌─────────┐ ┌──────────┐ │ FWindow │◄───┐ ┌───┤ FMenuBar │ └─────────┘ │ │ └──────────┘ diff --git a/src/fstatusbar.cpp b/src/fstatusbar.cpp index 3933a227..fdcc1ae3 100644 --- a/src/fstatusbar.cpp +++ b/src/fstatusbar.cpp @@ -425,16 +425,19 @@ void FStatusBar::onMouseUp (FMouseEvent* ev) while ( iter != end ) { - int x1 = X; - int kname_len = int(getKeyName((*iter)->getKey()).getLength()); - int txt_length = int((*iter)->getText().getLength()); - int x2 = x1 + kname_len + txt_length + 1; + int x1, x2, kname_len, txt_length; + + x1 = X; + kname_len = int(getKeyName((*iter)->getKey()).getLength()); + txt_length = int((*iter)->getText().getLength()); + x2 = x1 + kname_len + txt_length + 1; if ( (*iter)->hasMouseFocus() ) { + int mouse_x, mouse_y; (*iter)->unsetMouseFocus(); - int mouse_x = ev->getX(); - int mouse_y = ev->getY(); + mouse_x = ev->getX(); + mouse_y = ev->getY(); if ( mouse_x >= x1 && mouse_x <= x2 && mouse_y == 1 ) (*iter)->setActive(); redraw(); @@ -465,13 +468,15 @@ void FStatusBar::onMouseMove (FMouseEvent* ev) while ( iter != end ) { - int x1 = X; - int kname_len = int(getKeyName((*iter)->getKey()).getLength()); - int txt_length = int((*iter)->getText().getLength()); - int x2 = x1 + kname_len + txt_length + 1; + int x1, x2, mouse_x, mouse_y, kname_len, txt_length; - int mouse_x = ev->getX(); - int mouse_y = ev->getY(); + x1 = X; + kname_len = int(getKeyName((*iter)->getKey()).getLength()); + txt_length = int((*iter)->getText().getLength()); + x2 = x1 + kname_len + txt_length + 1; + + mouse_x = ev->getX(); + mouse_y = ev->getY(); if ( mouse_x >= x1 && mouse_x <= x2 && mouse_y == 1 ) diff --git a/src/fwidget.cpp b/src/fwidget.cpp index 207f6de2..7b8b18ee 100644 --- a/src/fwidget.cpp +++ b/src/fwidget.cpp @@ -1492,10 +1492,11 @@ void FWidget::setPos (const FPoint& p, bool adjust) //---------------------------------------------------------------------- void FWidget::setPos (int x, int y, bool adjust) { - if ( xpos == x && widgetSize.getX() == x ) - return; - if ( ypos == y && widgetSize.getY() == y ) + if ( xpos == x && widgetSize.getX() == x + && ypos == y && widgetSize.getY() == y ) + { return; + } if ( ! isWindow() ) { @@ -1675,8 +1676,9 @@ void FWidget::setGeometry (int x, int y, int w, int h, bool adjust) adjustWidgetSize.setRect(xpos, ypos, width, height); adjustWidgetSizeShadow = adjustWidgetSize + shadow; adjustWidgetSizeGlobal.setRect ( xpos + xmin - 1 - , ypos + ymin - 1, - width, height ); + , ypos + ymin - 1 + , width + , height ); adjustWidgetSizeGlobalShadow = adjustWidgetSizeGlobal + shadow; if ( adjust )