#include "lyxfunc.h"
#include "lyxtextclass.h"
#include "LyXView.h"
+#include "lyx_main.h"
namespace lyx {
last_textclass_(-1)
{}
+#define TurnOnFlag(x) flags |= ToolbarBackend::x
+#define TurnOffFlag(x) flags &= ~ToolbarBackend::x
+
+void Toolbars::initFlags(ToolbarBackend::Toolbar & tbb)
+{
+ ToolbarSection::ToolbarInfo & info = LyX::ref().session().toolbars().load(tbb.name);
+
+ unsigned int flags = static_cast<unsigned int>(tbb.flags);
+
+ // Remove default.ui positions. Only when a valid postion is stored
+ // in the session file the default.ui value will be overwritten
+ unsigned int save = flags;
+ TurnOffFlag(TOP);
+ TurnOffFlag(BOTTOM);
+ TurnOffFlag(RIGHT);
+ TurnOffFlag(LEFT);
+
+ bool valid_location = true;
+ // init tbb.flags with saved location
+ if (info.location == ToolbarSection::ToolbarInfo::TOP)
+ TurnOnFlag(TOP);
+ else if (info.location == ToolbarSection::ToolbarInfo::BOTTOM)
+ TurnOnFlag(BOTTOM);
+ else if (info.location == ToolbarSection::ToolbarInfo::RIGHT)
+ TurnOnFlag(RIGHT);
+ else if (info.location == ToolbarSection::ToolbarInfo::LEFT)
+ TurnOnFlag(LEFT);
+ else {
+ // use setting from default.ui
+ flags = save;
+ valid_location = false;
+ }
+
+ // invalid location is for a new toolbar that has no saved information,
+ // so info.visible is not used for this case.
+ if (valid_location) {
+ // init tbb.flags with saved visibility,
+ TurnOffFlag(ON);
+ TurnOffFlag(OFF);
+ TurnOffFlag(AUTO);
+ if (info.state == ToolbarSection::ToolbarInfo::ON)
+ TurnOnFlag(ON);
+ else if (info.state == ToolbarSection::ToolbarInfo::OFF)
+ TurnOnFlag(OFF);
+ else
+ TurnOnFlag(AUTO);
+ }
+ /*
+ std::cout << "State " << info.state << " FLAGS: " << flags
+ << " ON:" << (flags & ToolbarBackend::ON)
+ << " OFF:" << (flags & ToolbarBackend::OFF)
+ << " L:" << (flags & ToolbarBackend::LEFT)
+ << " R:" << (flags & ToolbarBackend::RIGHT)
+ << " T:" << (flags & ToolbarBackend::TOP)
+ << " B:" << (flags & ToolbarBackend::BOTTOM)
+ << " MA:" << (flags & ToolbarBackend::MATH)
+ << " RE:" << (flags & ToolbarBackend::REVIEW)
+ << " TB:" << (flags & ToolbarBackend::TABLE)
+ << " AU:" << (flags & ToolbarBackend::AUTO)
+ << std::endl;
+ */
+ // now set the flags
+ tbb.flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
+}
+
void Toolbars::init()
{
// extracts the toolbars from the backend
- ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
- ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
+ ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
+ ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
- for (; cit != end; ++cit)
+ for (; cit != end; ++cit) {
+ initFlags(*cit);
add(*cit);
+ }
}
void Toolbars::display(string const & name, bool show)
{
- ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
- ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
+ ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
+ ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
for (; cit != end; ++cit) {
if (cit->name == name) {
+ unsigned int flags = cit->flags;
+ TurnOffFlag(AUTO);
+ if (show) {
+ TurnOnFlag(ON);
+ TurnOnFlag(OFF);
+ } else {
+ TurnOnFlag(OFF);
+ TurnOnFlag(ON);
+ }
+ cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
displayToolbar(*cit, show);
return;
}
}
+ToolbarBackend::Flags Toolbars::getToolbarState(string const & name)
+{
+ ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
+ ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
+
+ for (; cit != end; ++cit) {
+ if (cit->name == name)
+ return cit->flags;
+ }
+
+ lyxerr[Debug::GUI] << "Toolbar::display: no toolbar named "
+ << name << endl;
+
+ // return dummy for msvc
+ return ToolbarBackend::OFF;
+}
+
+
+void Toolbars::toggleToolbarState(string const & name)
+{
+ ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
+ ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
+
+ for (; cit != end; ++cit) {
+ if (cit->name == name) {
+ int flags = cit->flags;
+ // off -> on
+ if (flags & ToolbarBackend::OFF) {
+ TurnOffFlag(OFF);
+ TurnOnFlag(ON);
+ // auto -> off
+ } else if (flags & ToolbarBackend::AUTO) {
+ TurnOffFlag(AUTO);
+ TurnOnFlag(OFF);
+ } else if ((flags & ToolbarBackend::MATH) || (flags & ToolbarBackend::TABLE)
+ || (flags & ToolbarBackend::REVIEW)) {
+ // for math etc, toggle from on -> auto
+ TurnOffFlag(ON);
+ TurnOnFlag(AUTO);
+ } else {
+ // for others, toggle from on -> off
+ TurnOffFlag(ON);
+ TurnOnFlag(OFF);
+ }
+ cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
+ return;
+ }
+ }
+ lyxerr[Debug::GUI] << "Toolbar::display: no toolbar named "
+ << name << endl;
+}
+#undef TurnOnFlag
+#undef TurnOffFlag
+
+
void Toolbars::update(bool in_math, bool in_table, bool review)
{
update();
ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
for (; cit != end; ++cit) {
- if (cit->flags & ToolbarBackend::MATH)
+ if (cit->flags & ToolbarBackend::ON)
+ displayToolbar(*cit, true);
+ else if (cit->flags & ToolbarBackend::OFF)
+ displayToolbar(*cit, false);
+ else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::MATH))
displayToolbar(*cit, in_math);
- else if (cit->flags & ToolbarBackend::TABLE)
+ else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::TABLE))
displayToolbar(*cit, in_table);
- else if (cit->flags & ToolbarBackend::REVIEW)
+ else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::REVIEW))
displayToolbar(*cit, review);
}
}
+void Toolbars::saveToolbarInfo()
+{
+ ToolbarSection & tb = LyX::ref().session().toolbars();
+
+ for (ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
+ cit != toolbarbackend.end(); ++cit) {
+ ToolbarsMap::iterator it = toolbars_.find(cit->name);
+ BOOST_ASSERT(it != toolbars_.end());
+ // get toolbar info from session.
+ ToolbarSection::ToolbarInfo & info = tb.load(cit->name);
+ if (cit->flags & ToolbarBackend::ON)
+ info.state = ToolbarSection::ToolbarInfo::ON;
+ else if (cit->flags & ToolbarBackend::OFF)
+ info.state = ToolbarSection::ToolbarInfo::OFF;
+ else if (cit->flags & ToolbarBackend::AUTO)
+ info.state = ToolbarSection::ToolbarInfo::AUTO;
+ // save other information
+ // if auto, frontend should *not* set on/off
+ it->second->saveInfo(info);
+ // maybe it is useful to update flags with real status. I do not know
+ /*
+ if (!(cit->flags & ToolbarBackend::AUTO)) {
+ unsigned int flags = static_cast<unsigned int>(cit->flags);
+ flags &= ~(info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarBackend::OFF : ToolbarBackend::ON);
+ flags |= (info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarBackend::ON : ToolbarBackend::OFF);
+ if (info.state == ToolbarSection::ToolbarInfo::ON)
+ cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
+ }
+ */
+ }
+}
+
+
void Toolbars::setLayout(string const & layout)
{
if (layout_)
// Yes, the lyx::to_utf8(_()) is correct
if (lyx::to_utf8(_(itname)) == name) {
FuncRequest const func(LFUN_LAYOUT, itname,
- FuncRequest::UI);
+ FuncRequest::TOOLBAR);
lv.dispatch(func);
return;
}