And here the updated patch.
Position and visibility is stored, and
when a toolbar is not visible at start up
it is context sensitive.
When you move a context visible toolbar
the position is also rememberd even when
the toolbar is hidden when exiting.
Peter
Index: session.C
===================================================================
--- session.C (revision 15652)
+++ session.C (working copy)
@@ -48,6 +48,7 @@
string const sec_lastopened = "[last opened files]";
string const sec_bookmarks = "[bookmarks]";
string const sec_session = "[session info]";
+string const sec_toolbars = "[toolbars]";
} // anon namespace
@@ -251,6 +252,59 @@
}
+void ToolbarSection::read(istream & is)
+{
+ string tmp;
+ do {
+ char c = is.peek();
+ if (c == '[')
+ break;
+ getline(is, tmp);
+
+ // Read session info, saved as key/value pairs
+ // would better yell if pos returns npos
+ string::size_type pos = tmp.find_first_of(" = ");
+ // silently ignore lines without " = "
+ if (pos != string::npos) {
+ string key = tmp.substr(0, pos);
+ bool visible;
+ int posX;
+ int posY;
+ int location;
+ istringstream value(tmp.substr(pos + 3));
+ value >> visible;
+ value.ignore(1); // ignore " "
+ value >> posX;
+ value.ignore(1); // ignore " "
+ value >> posY;
+ value.ignore(1); // ignore " "
+ value >> location;
+ toolbars[key] = ToolbarInfo(visible, posX, posY,
location);
+ }
+ } while (is.good());
+}
+
+
+void ToolbarSection::write(ostream & os) const
+{
+ os << '\n' << sec_toolbars << '\n';
+ for (ToolbarMap::const_iterator tb = toolbars.begin();
+ tb != toolbars.end(); ++tb) {
+ os << tb->first << " = "
+ << tb->second.visible << " "
+ << tb->second.posX << " "
+ << tb->second.posY << " "
+ << tb->second.location << '\n';
+ }
+}
+
+
+ToolbarSection::ToolbarInfo & ToolbarSection::load(string const & name)
+{
+ return toolbars[name];
+}
+
+
void SessionInfoSection::read(istream & is)
{
string tmp;
@@ -334,6 +388,8 @@
lastFilePos().read(is);
else if (tmp == sec_bookmarks)
bookmarks().read(is);
+ else if (tmp == sec_toolbars)
+ toolbars().read(is);
else if (tmp == sec_session)
sessionInfo().read(is);
else
@@ -353,6 +409,7 @@
lastOpened().write(os);
lastFilePos().write(os);
bookmarks().write(os);
+ toolbars().write(os);
sessionInfo().write(os);
} else
lyxerr << "LyX: Warning: unable to save Session: "
Index: frontends/LyXView.h
===================================================================
--- frontends/LyXView.h (revision 15652)
+++ frontends/LyXView.h (working copy)
@@ -136,6 +136,7 @@
/// update the toolbar
void updateToolbars();
+
/// update the menubar
void updateMenubar();
/// update the status bar
Index: frontends/Toolbars.C
===================================================================
--- frontends/Toolbars.C (revision 15652)
+++ frontends/Toolbars.C (working copy)
@@ -24,6 +24,14 @@
#include "LyXView.h"
+namespace {
+ static lyx::ToolbarBackend::Flags toTBFlags(int i)
+ {
+ return static_cast<lyx::ToolbarBackend::Flags>(i);
+ }
+}
+
+
namespace lyx {
using std::endl;
@@ -37,14 +45,48 @@
{}
+void Toolbars::initFlags(ToolbarBackend::Toolbar & tbb)
+{
+ ToolbarSection::ToolbarInfo & info =
LyX::ref().session().toolbars().load(tbb.name);
+
+ // remove position
+ ToolbarBackend::Flags clean = toTBFlags( tbb.flags
+ &
~ToolbarBackend::TOP & ~ToolbarBackend::BOTTOM
+ &
~ToolbarBackend::RIGHT & ~ToolbarBackend::LEFT);
+
+ bool valid_location = true;
+ // init tbb.flags with saved location
+ if (info.location == ToolbarSection::ToolbarInfo::top)
+ tbb.flags = toTBFlags(clean | ToolbarBackend::TOP);
+ else if (info.location == ToolbarSection::ToolbarInfo::bottom)
+ tbb.flags = toTBFlags(clean | ToolbarBackend::BOTTOM);
+ else if (info.location == ToolbarSection::ToolbarInfo::right)
+ tbb.flags = toTBFlags(clean | ToolbarBackend::RIGHT);
+ else if (info.location == ToolbarSection::ToolbarInfo::left)
+ tbb.flags = toTBFlags(clean | ToolbarBackend::LEFT);
+ else
+ valid_location = false;
+
+ // init tbb.flags with saved visibility,
+ // disable context sensitive flags when visibale
+ if (valid_location && info.visible)
+ tbb.flags = toTBFlags( (tbb.flags
+ &
~ToolbarBackend::OFF & ~ToolbarBackend::MATH
+ &
~ToolbarBackend::TABLE& ~ToolbarBackend::REVIEW)
+ |
ToolbarBackend::ON);
+}
+
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)
+ {
+ initFlags(*cit);
add(*cit);
+ }
}
@@ -84,6 +126,19 @@
}
+void Toolbars::saveToolbarInfo()
+{
+ ToolbarSection & tb = LyX::ref().session().toolbars();
+
+ for (ToolbarBackend::Toolbars::const_iterator cit =
toolbarbackend.begin();
+ cit != toolbarbackend.end(); ++cit) {
+ ToolbarsMap::iterator it = toolbars_.find(cit->name);
+ BOOST_ASSERT(it != toolbars_.end());
+ it->second->saveInfo(tb.load(cit->name));
+ }
+}
+
+
void Toolbars::setLayout(string const & layout)
{
if (layout_)
Index: frontends/qt4/QLToolbar.C
===================================================================
--- frontends/qt4/QLToolbar.C (revision 15652)
+++ frontends/qt4/QLToolbar.C (working copy)
@@ -214,6 +214,26 @@
}
+void QLToolbar::saveInfo(ToolbarSection::ToolbarInfo & info)
+{
+ // update Toolbar info with current toolbar status
+ // FIXME: there are more information can be saved here
+ info.visible = QLToolbar::isVisible();
+ Qt::ToolBarArea loc = owner_.toolBarArea(this);
+
+ if (loc == Qt::TopToolBarArea)
+ info.location = ToolbarSection::ToolbarInfo::top;
+ else if (loc == Qt::BottomToolBarArea)
+ info.location = ToolbarSection::ToolbarInfo::bottom;
+ else if (loc == Qt::RightToolBarArea)
+ info.location = ToolbarSection::ToolbarInfo::right;
+ else if (loc == Qt::LeftToolBarArea)
+ info.location = ToolbarSection::ToolbarInfo::left;
+ else
+ info.location = ToolbarSection::ToolbarInfo::notset;
+}
+
+
void QLToolbar::update()
{
// This is a speed bottleneck because this is called on every keypress
Index: frontends/qt4/QLToolbar.h
===================================================================
--- frontends/qt4/QLToolbar.h (revision 15652)
+++ frontends/qt4/QLToolbar.h (working copy)
@@ -22,6 +22,9 @@
#include <QToolBar>
#include <vector>
+#include "lyx_main.h"
+#include "session.h"
+
class QComboBox;
namespace lyx {
@@ -67,6 +70,7 @@
void add(FuncRequest const & func, lyx::docstring const & tooltip);
void hide(bool);
void show(bool);
+ void saveInfo(ToolbarSection::ToolbarInfo & info);
void update();
LayoutBox * layout() const { return layout_.get(); }
Index: frontends/qt4/GuiView.C
===================================================================
--- frontends/qt4/GuiView.C (revision 15652)
+++ frontends/qt4/GuiView.C (working copy)
@@ -182,6 +182,8 @@
session.sessionInfo().save("WindowPosX",
convert<string>(geometry.x()));
session.sessionInfo().save("WindowPosY",
convert<string>(geometry.y()));
}
+ // FIXME: put savetoolbar here?
+ getToolbars().saveToolbarInfo();
}
void GuiView::setGeometry(unsigned int width,
@@ -465,7 +467,6 @@
}
}
-
Toolbars::ToolbarPtr GuiView::makeToolbar(ToolbarBackend::Toolbar const & tbb)
{
QLToolbar * Tb = new QLToolbar(tbb, *this);
Index: frontends/Toolbars.h
===================================================================
--- frontends/Toolbars.h (revision 15652)
+++ frontends/Toolbars.h (working copy)
@@ -26,6 +26,8 @@
#include "ToolbarBackend.h"
#include <boost/shared_ptr.hpp>
#include <map>
+#include "lyx_main.h"
+#include "session.h"
namespace lyx {
@@ -64,6 +66,10 @@
* metrics should be updated.
*/
virtual void show(bool update_metrics) = 0;
+ /** update toolbar information
+ * ToolbarInfo will then be saved by session
+ */
+ virtual void saveInfo(ToolbarSection::ToolbarInfo & info) = 0;
/// Refresh the contents of the bar.
virtual void update() = 0;
@@ -86,6 +92,9 @@
/// Update the state of the toolbars.
void update(bool in_math, bool in_table, bool review);
+ /// save toolbar information
+ void saveToolbarInfo();
+
/// Select the right layout in the combox.
void setLayout(std::string const & layout);
@@ -128,6 +137,9 @@
/// The last textclass layout list in the layout choice selector
int last_textclass_;
+
+ // load flags with saved values
+ void initFlags(ToolbarBackend::Toolbar & tbb);
};
/// Set the layout in the kernel when an entry has been selected
Index: session.h
===================================================================
--- session.h (revision 15652)
+++ session.h (working copy)
@@ -202,6 +202,65 @@
};
+class ToolbarSection : SessionSection
+{
+public:
+ /// information about a toolbar, not all information can be
+ /// saved/restored by all frontends, but this class provides
+ /// a superset of things that can be managed by session.
+ class ToolbarInfo
+ {
+ public:
+ ///
+ ToolbarInfo() :
+ empty(true), visible(false), posX(0), posY(0),
location(notset) { }
+ ///
+ ToolbarInfo(bool v, int x, int y, int loc) :
+ empty(false), visible(v), posX(x), posY(y),
location(static_cast<Location>(loc)) { }
+
+ public:
+ /// true means no information is available (so ignore visible
settings)
+ bool empty;
+ /// on/off
+ bool visible;
+ /// position
+ int posX;
+ ///
+ int posY;
+
+ /// location: this can be intepreted differently.
+ enum Location {
+ top,
+ bottom,
+ left,
+ right,
+ notset
+ };
+
+ Location location;
+
+ /// potentially, icons
+ };
+
+ /// info for each toolbar
+ typedef std::map<std::string, ToolbarInfo> ToolbarMap;
+
+public:
+ ///
+ void read(std::istream & is);
+
+ ///
+ void write(std::ostream & os) const;
+
+ /// return reference to toolbar info, create a new one if needed
+ ToolbarInfo & load(std::string const & name);
+
+private:
+ /// toolbar information
+ ToolbarMap toolbars;
+};
+
+
class SessionInfoSection : SessionSection
{
public:
@@ -271,6 +330,12 @@
BookmarksSection const & bookmarks() const { return bookmarks_; }
///
+ ToolbarSection & toolbars() { return toolbars_; }
+
+ ///
+ ToolbarSection const & toolbars() const { return toolbars_; }
+
+ ///
SessionInfoSection & sessionInfo() { return session_info; }
///
@@ -300,6 +365,9 @@
BookmarksSection bookmarks_;
///
+ ToolbarSection toolbars_;
+
+ ///
SessionInfoSection session_info;
};
Index: ToolbarBackend.h
===================================================================
--- ToolbarBackend.h (revision 15652)
+++ ToolbarBackend.h (working copy)
@@ -75,9 +75,9 @@
ToolbarBackend();
/// iterator for all toolbars
- Toolbars::const_iterator begin() const { return usedtoolbars.begin(); }
+ Toolbars::iterator begin() { return usedtoolbars.begin(); }
- Toolbars::const_iterator end() const { return usedtoolbars.end(); }
+ Toolbars::iterator end() { return usedtoolbars.end(); }
/// read a toolbar from the file
void read(LyXLex &);