diff --git a/ChangeLog b/ChangeLog index cb4ffa5e..21ba8f54 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2016-08-20 Markus Gans + * Switch back to the own dialog when you closing a dialog menu + 2016-08-14 Markus Gans * Screen characters now have a transparent and a transparent shadow option diff --git a/src/fapp.cpp b/src/fapp.cpp index e1674f32..b31524cf 100644 --- a/src/fapp.cpp +++ b/src/fapp.cpp @@ -1391,13 +1391,21 @@ void FApplication::processMouseEvent() if ( ! menu->containsMenuStructure(*mouse) ) { + bool is_window_menu; + FWidget* super = menu->getSuperMenu(); + + if ( super && menu->isWindowsMenu(super) ) + is_window_menu = true; + else + is_window_menu = false; + menu->unselectItem(); menu->hide(); menu->hideSubMenus(); menu->hideSuperMenus(); - // No widget was been clicked - if ( ! clicked_widget ) + // No widget was been clicked and the menu is no dialog menu + if ( ! (clicked_widget && is_window_menu) ) FWindow::switchToPrevWindow(); if ( statusBar() ) diff --git a/src/fdialog.cpp b/src/fdialog.cpp index f89e9e20..d98a0210 100644 --- a/src/fdialog.cpp +++ b/src/fdialog.cpp @@ -101,7 +101,6 @@ void FDialog::init() createArea (vwin); setGeometry (1, 1, 10, 10, false); // initialize geometry values ignore_padding = true; - window_object = true; dialog_object = true; addDialog(this); addWindow(this); @@ -125,6 +124,7 @@ void FDialog::init() } accelerator_list = new Accelerators(); + // Add the dialog menu dialog_menu = new FMenu ("-", this); dialog_menu->move (xpos, ypos+1); dgl_menuitem = dialog_menu->getItem(); @@ -268,7 +268,7 @@ void FDialog::drawTitleBar() if ( getMaxColor() < 16 ) setBold(); - if ( isActiveWindow() || dialog_menu->isVisible() ) + if ( isActiveWindow() || (dialog_menu && dialog_menu->isVisible()) ) setColor (wc.titlebar_active_fg, wc.titlebar_active_bg); else setColor (wc.titlebar_inactive_fg, wc.titlebar_inactive_bg); @@ -788,7 +788,7 @@ void FDialog::onWindowActive (FEvent*) //---------------------------------------------------------------------- void FDialog::onWindowInactive (FEvent*) { - if ( ! dialog_menu->isVisible() ) + if ( dialog_menu && ! dialog_menu->isVisible() ) FWindow::previous_widget = this; if ( isVisible() && isEnabled() ) diff --git a/src/fmenu.cpp b/src/fmenu.cpp index d5e22f73..68e102a6 100644 --- a/src/fmenu.cpp +++ b/src/fmenu.cpp @@ -117,7 +117,6 @@ void FMenu::init(FWidget* parent) createArea (vwin); setGeometry (1, 1, 10, 2, false); // initialize geometry values setTransparentShadow(); - window_object = true; menu_object = true; addWindow(this); hide(); @@ -1040,12 +1039,14 @@ void FMenu::onKeyPress (FKeyEvent* ev) } else { + FWidget* super = getSuperMenu(); hideSuperMenus(); if ( statusBar() ) statusBar()->clearMessage(); - switchToPrevWindow(); + if ( ! super || ! isWindowsMenu(super) ) + switchToPrevWindow(); } if ( statusBar() ) diff --git a/src/fmenubar.cpp b/src/fmenubar.cpp index be5b0857..82319468 100644 --- a/src/fmenubar.cpp +++ b/src/fmenubar.cpp @@ -46,7 +46,6 @@ void FMenuBar::init() ypos = 1; createArea (vmenubar); vmenubar->visible = true; - window_object = true; ignore_padding = true; // initialize geometry values setGeometry (1, 1, getColumnNumber(), 1, false); diff --git a/src/fstatusbar.cpp b/src/fstatusbar.cpp index 7cf1d1eb..1a97f8bf 100644 --- a/src/fstatusbar.cpp +++ b/src/fstatusbar.cpp @@ -190,7 +190,6 @@ void FStatusBar::init() ypos = getLineNumber(); createArea (vstatusbar); vstatusbar->visible = true; - window_object = true; ignore_padding = true; mouse_down = false; diff --git a/src/fwidget.cpp b/src/fwidget.cpp index beea2662..43552c1d 100644 --- a/src/fwidget.cpp +++ b/src/fwidget.cpp @@ -768,7 +768,7 @@ bool FWidget::focusNextChild() FObject::object_list children; FObject::object_list::iterator iter, end; - children = getParent()->getChildren(); + children = parent->getChildren(); iter = children.begin(); end = children.end(); @@ -838,7 +838,7 @@ bool FWidget::focusPrevChild() FObject::object_list children; FObject::object_list::iterator iter, begin; - children = getParent()->getChildren(); + children = parent->getChildren(); iter = children.end(); begin = children.begin(); @@ -1428,13 +1428,12 @@ void FWidget::hide() visible = false; shown = false; - if ( FWidget::getFocusWidget() == this ) + if ( ! isDialog() + && FWidget::getFocusWidget() == this + && ! focusPrevChild() ) { - if ( ! focusPrevChild() ) - { - FWidget::getFocusWidget()->unsetFocus(); - FWidget::setFocusWidget(getParentWidget()); - } + FWidget::getFocusWidget()->unsetFocus(); + FWidget::setFocusWidget(getParentWidget()); } FHideEvent hide_ev (fc::Hide_Event); diff --git a/src/fwindow.cpp b/src/fwindow.cpp index d1d8a7d4..1b5b530c 100644 --- a/src/fwindow.cpp +++ b/src/fwindow.cpp @@ -19,7 +19,9 @@ FWindow::FWindow(FWidget* parent) : FWidget(parent) , window_active(false) , win_focus_widget(0) -{ } +{ + window_object = true; +} //---------------------------------------------------------------------- FWindow::~FWindow() // destructor @@ -94,6 +96,9 @@ void FWindow::hide() if ( area ) area->visible = false; + if ( isDialog() ) + switchToPrevWindow(); + FWidget::hide(); } diff --git a/test/windows.cpp b/test/windows.cpp index 389375e1..08fb8718 100644 --- a/test/windows.cpp +++ b/test/windows.cpp @@ -220,8 +220,13 @@ void Window::onClose (FCloseEvent* ev) //---------------------------------------------------------------------- void Window::cb_createWindows (FWidget*, void*) { + int w,h,dx,dy; std::vector::const_iterator iter, begin; iter = begin = windows.begin(); + w = getRootWidget()->getWidth(); + h = getRootWidget()->getHeight(); + dx = (w > 80) ? (w - 80) / 2 : 0; + dy = (h > 24) ? (h - 24) / 2 : 0; while ( iter != windows.end() ) { @@ -234,8 +239,8 @@ void Window::cb_createWindows (FWidget*, void*) win_dat->is_open = true; win->setText(*(win_dat)->title); n = int(std::distance(begin, iter)); - x = 5 + (n%3)*25 + int(n/3)*3; - y = 11 + int(n/3)*3; + x = dx + 5 + (n%3)*25 + int(n/3)*3; + y = dy + 11 + int(n/3)*3; win->setGeometry (x, y, 20, 8); win->setTransparentShadow(); win->show(); @@ -369,12 +374,14 @@ void Window::cb_destroyWindow (FWidget*, void* data_ptr) //---------------------------------------------------------------------- void Window::adjustSize() { - int w,h,X,Y; + int w,h,X,Y,dx,dy; std::vector::const_iterator iter, begin; - w = getRootWidget()->getWidth(); - h = getRootWidget()->getHeight(); - X = int(1 + (w - 40) / 2); - Y = int(1 + (h - 22) / 2); + w = getRootWidget()->getWidth(); + h = getRootWidget()->getHeight(); + X = int(1 + (w - 40) / 2); + Y = int(1 + (h - 22) / 2); + dx = (w > 80) ? (w - 80) / 2 : 0; + dy = (h > 24) ? (h - 24) / 2 : 0; if ( Y < 2) Y = 2; @@ -386,12 +393,10 @@ void Window::adjustSize() { if ( (*iter)->is_open ) { - int x,y,dx,dy,n; - n = int(std::distance(begin, iter)); - dx = (w > 80) ? (w - 80) / 2 : 0; - dy = (h > 24) ? (h - 24) / 2 : 0; - x = dx + 5 + (n%3)*25 + int(n/3)*3; - y = dy + 11 + int(n/3)*3; + int x,y,n; + n = int(std::distance(begin, iter)); + x = dx + 5 + (n%3)*25 + int(n/3)*3; + y = dy + 11 + int(n/3)*3; (*iter)->dgl->setPos (x, y, false); }