diff --git a/aegisub/Makefile.am b/aegisub/Makefile.am index 1aa68ad8d..af979ccf9 100644 --- a/aegisub/Makefile.am +++ b/aegisub/Makefile.am @@ -200,6 +200,7 @@ aegisub_SOURCES = \ thesaurus_myspell.cpp \ timeedit_ctrl.cpp \ toggle_bitmap.cpp \ + tooltip_manager.cpp \ utils.cpp \ validators.cpp \ variable_data.cpp \ diff --git a/aegisub/tooltip_manager.cpp b/aegisub/tooltip_manager.cpp new file mode 100644 index 000000000..718e6cc38 --- /dev/null +++ b/aegisub/tooltip_manager.cpp @@ -0,0 +1,91 @@ +// Copyright (c) 2007, Rodrigo Braz Monteiro, Niels Martin Hansen +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Aegisub Group nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------------- +// +// AEGISUB +// +// Website: http://aegisub.cellosoft.com +// Contact: mailto:zeratul@cellosoft.com +// + + +/////////// +// Headers +#include "tooltip_manager.h" + + +/////////////////// +// Update all tips +void ToolTipManager::DoUpdate() { + for (std::list::iterator cur=tips.begin();cur!=tips.end();cur++) { + (*cur).Update(); + } +} + + +///////////// +// Add a tip +void ToolTipManager::AddTips(wxWindow *window,wxString tooltip,wxArrayString hotkeys) { + ToolTipBinding tip; + tip.hotkeys = hotkeys; + tip.window = window; + tip.toolTip = tooltip; + tip.Update(); + tips.push_back(tip); +} + + +////////////////////////// +// Single hotkey overload +void ToolTipManager::Bind(wxWindow *window,wxString tooltip,wxString hotkey) { + wxArrayString hotkeys; + if (!hotkey.IsEmpty()) hotkeys.Add(hotkey); + Bind(window,tooltip,hotkeys); +} + + +/////////////////// +// Static instance +ToolTipManager *ToolTipManager::instance = NULL; +ToolTipManager *ToolTipManager::GetInstance() { + if (!instance) instance = new ToolTipManager; + return instance; +} + + +//////////////// +// Update a tip +void ToolTipBinding::Update() { + wxString finalTip = toolTip; + wxArrayString hotkeysLeft = hotkeys; + while (hotkeysLeft.Count()) { + finalTip.Replace(_T("%KEY%"),hotkeysLeft[0],false); + hotkeysLeft.RemoveAt(0); + } + window->SetToolTip(finalTip); +} diff --git a/aegisub/tooltip_manager.h b/aegisub/tooltip_manager.h new file mode 100644 index 000000000..6f812ead4 --- /dev/null +++ b/aegisub/tooltip_manager.h @@ -0,0 +1,75 @@ +// Copyright (c) 2007, Rodrigo Braz Monteiro, Niels Martin Hansen +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Aegisub Group nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------------- +// +// AEGISUB +// +// Website: http://aegisub.cellosoft.com +// Contact: mailto:zeratul@cellosoft.com +// + + +#pragma once + + +/////////// +// Headers +#include +#include + + +/////////////////// +// Tooltip binding +class ToolTipBinding { + friend class ToolTipManager; +private: + wxWindow *window; + wxString toolTip; + wxArrayString hotkeys; + + void Update(); +}; + + +///////////////////////////// +// Tooltip manager singleton +class ToolTipManager { +private: + static ToolTipManager *instance; + static ToolTipManager *GetInstance(); + + std::list tips; + + void DoUpdate(); + void AddTips(wxWindow *window,wxString tooltip,wxArrayString hotkeys); + +public: + static void Update() { GetInstance()->DoUpdate(); } + static void Bind(wxWindow *window,wxString tooltip,wxArrayString hotkeys) { GetInstance()->AddTips(window,tooltip,hotkeys); } + static void Bind(wxWindow *window,wxString tooltip,wxString hotkey=_T("")); +};