summaryrefslogtreecommitdiff
path: root/src/gui/focushandler.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2011-01-02 01:48:38 +0200
committerAndrei Karas <akaras@inbox.ru>2011-01-02 02:41:24 +0200
commit3eeae12c498d1a4dbe969462d2ba841f77ee3ccb (patch)
treeff8eab35e732bc0749fc11677c8873a7b3a58704 /src/gui/focushandler.cpp
downloadplus-3eeae12c498d1a4dbe969462d2ba841f77ee3ccb.tar.gz
plus-3eeae12c498d1a4dbe969462d2ba841f77ee3ccb.tar.bz2
plus-3eeae12c498d1a4dbe969462d2ba841f77ee3ccb.tar.xz
plus-3eeae12c498d1a4dbe969462d2ba841f77ee3ccb.zip
Initial commit.
This code based on mana client http://www.gitorious.org/mana/mana and my private repository.
Diffstat (limited to 'src/gui/focushandler.cpp')
-rw-r--r--src/gui/focushandler.cpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/gui/focushandler.cpp b/src/gui/focushandler.cpp
new file mode 100644
index 000000000..9a2a244cc
--- /dev/null
+++ b/src/gui/focushandler.cpp
@@ -0,0 +1,99 @@
+/*
+ * The Mana Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ *
+ * This file is part of The Mana Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "focushandler.h"
+
+#include "gui/widgets/window.h"
+
+void FocusHandler::requestModalFocus(gcn::Widget *widget)
+{
+ /* If there is another widget with modal focus, remove its modal focus
+ * and put it on the modal widget stack.
+ */
+ if (mModalFocusedWidget && mModalFocusedWidget != widget)
+ {
+ mModalStack.push_front(mModalFocusedWidget);
+ mModalFocusedWidget = NULL;
+ }
+
+ gcn::FocusHandler::requestModalFocus(widget);
+}
+
+void FocusHandler::releaseModalFocus(gcn::Widget *widget)
+{
+ mModalStack.remove(widget);
+
+ if (mModalFocusedWidget == widget)
+ {
+ gcn::FocusHandler::releaseModalFocus(widget);
+
+ /* Check if there were any previously modal widgets that'd still like
+ * to regain their modal focus.
+ */
+ if (!mModalStack.empty())
+ {
+ gcn::FocusHandler::requestModalFocus(mModalStack.front());
+ mModalStack.pop_front();
+ }
+ }
+}
+
+void FocusHandler::remove(gcn::Widget *widget)
+{
+ releaseModalFocus(widget);
+
+ gcn::FocusHandler::remove(widget);
+}
+
+void FocusHandler::tabNext()
+{
+ gcn::FocusHandler::tabNext();
+
+ checkForWindow();
+}
+
+void FocusHandler::tabPrevious()
+{
+ gcn::FocusHandler::tabPrevious();
+
+ checkForWindow();
+}
+
+void FocusHandler::checkForWindow()
+{
+ if (mFocusedWidget)
+ {
+ gcn::Widget *widget = mFocusedWidget->getParent();
+
+ while (widget)
+ {
+ Window *window = dynamic_cast<Window*>(widget);
+
+ if (window)
+ {
+ window->requestMoveToTop();
+ break;
+ }
+
+ widget = widget->getParent();
+ }
+ }
+}