Dear all,
The attached patch save/restore toolbar information (right now
on/off). The patch almost works, but all toolbars are displayed even
when session disables QToolbar::show() (see patch).
Peter and Abdel: please comment.
+ ToolbarSection::ToolbarInfo & status =
LyX::ref().session().toolbars().load(tbb.name);
+ status.visible = status.visible || (status.empty && tbb.flags &&
ToolbarBackend::ON);
+ tb_ptr->show(false, status);
The show function now accepts a full structure that contains various
toolbar information. How to make use of them is supposed to be
frontend-specific.
+void QLToolbar::show(bool, ToolbarSection::ToolbarInfo const & info)
{
- QToolBar::show();
+ // FIXME: info should contain information about toolbar location
+ // etc. This function should make use of them to restore toolbar
+ // position etc.
+ // FIXME: the following seems to be appropriate, but toolbars are shown
+ // even with the following commented out???
+// if (info.visible)
+// QToolBar::show();
}
This is where Peter should move toolbars around when lyx starts. This
does not work now since all toolbars are displayed even when I comment
out QToolBar::show(). I do not know what is going on here.
+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();
+}
This is where Peter should save toolbar information when lyx ends.
+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(-1), posY(-1),
location(-1) { }
+ ///
+ ToolbarInfo(bool v, int x, int y) :
+ empty(false), visible(v), posX(x), posY(y),
location(-1) { }
+
+ 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.
+ int location;
+ /// potentially, icons
+ };
This is where Toolbar info is handled. Peter, what information do you
want to save? Maybe toolbar orders as well?
Cheers,
Bo
Index: src/session.C
===================================================================
--- src/session.C (revision 15650)
+++ src/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
@@ -267,6 +268,57 @@
}
+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 >> posX;
+ value.ignore(2); // ignore ", "
+ value >> posY;
+ value.ignore(2); // ignore ", "
+ value >> location;
+ toolbars[key] = ToolbarInfo(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;
@@ -349,6 +401,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
@@ -368,6 +422,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: src/frontends/LyXView.h
===================================================================
--- src/frontends/LyXView.h (revision 15649)
+++ src/frontends/LyXView.h (working copy)
@@ -136,6 +136,8 @@
/// update the toolbar
void updateToolbars();
+ /// save the status of toolbars
+ void saveToolbarInfo();
/// update the menubar
void updateMenubar();
/// update the status bar
Index: src/frontends/Toolbars.C
===================================================================
--- src/frontends/Toolbars.C (revision 15649)
+++ src/frontends/Toolbars.C (working copy)
@@ -84,6 +84,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_)
@@ -124,10 +137,9 @@
ToolbarPtr tb_ptr = owner_.makeToolbar(tbb);
toolbars_[tbb.name] = tb_ptr;
- if (tbb.flags & ToolbarBackend::ON)
- tb_ptr->show(false);
- else
- tb_ptr->hide(false);
+ ToolbarSection::ToolbarInfo & status = LyX::ref().session().toolbars().load(tbb.name);
+ status.visible = status.visible || (status.empty && tbb.flags && ToolbarBackend::ON);
+ tb_ptr->show(false, status);
if (tb_ptr->layout())
layout_ = tb_ptr->layout();
@@ -140,10 +152,10 @@
ToolbarsMap::iterator it = toolbars_.find(tbb.name);
BOOST_ASSERT(it != toolbars_.end());
- if (show_it)
- it->second->show(true);
- else
- it->second->hide(true);
+ ToolbarSection::ToolbarInfo & status = LyX::ref().session().toolbars().load(tbb.name);
+ status.visible = show_it;
+
+ it->second->show(true, status);
}
Index: src/frontends/qt4/QLToolbar.C
===================================================================
--- src/frontends/qt4/QLToolbar.C (revision 15649)
+++ src/frontends/qt4/QLToolbar.C (working copy)
@@ -208,12 +208,26 @@
}
-void QLToolbar::show(bool)
+void QLToolbar::show(bool, ToolbarSection::ToolbarInfo const & info)
{
- QToolBar::show();
+ // FIXME: info should contain information about toolbar location
+ // etc. This function should make use of them to restore toolbar
+ // position etc.
+ // FIXME: the following seems to be appropriate, but toolbars are shown
+ // even with the following commented out???
+// if (info.visible)
+// QToolBar::show();
}
+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();
+}
+
+
void QLToolbar::update()
{
// This is a speed bottleneck because this is called on every keypress
Index: src/frontends/qt4/QLToolbar.h
===================================================================
--- src/frontends/qt4/QLToolbar.h (revision 15649)
+++ src/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 {
@@ -66,7 +69,8 @@
void add(FuncRequest const & func, lyx::docstring const & tooltip);
void hide(bool);
- void show(bool);
+ void show(bool, ToolbarSection::ToolbarInfo const & info);
+ void saveInfo(ToolbarSection::ToolbarInfo & info);
void update();
LayoutBox * layout() const { return layout_.get(); }
Index: src/frontends/qt4/GuiView.C
===================================================================
--- src/frontends/qt4/GuiView.C (revision 15649)
+++ src/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?
+ saveToolbarInfo();
}
void GuiView::setGeometry(unsigned int width,
Index: src/frontends/LyXView.C
===================================================================
--- src/frontends/LyXView.C (revision 15649)
+++ src/frontends/LyXView.C (working copy)
@@ -305,6 +305,12 @@
}
+void LyXView::saveToolbarInfo()
+{
+ toolbars_->saveToolbarInfo();
+}
+
+
void LyXView::updateMenubar()
{
menubar_->update();
Index: src/frontends/Toolbars.h
===================================================================
--- src/frontends/Toolbars.h (revision 15649)
+++ src/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 {
@@ -63,7 +65,11 @@
* \param update_metrics is a hint to the layout engine that the
* metrics should be updated.
*/
- virtual void show(bool update_metrics) = 0;
+ virtual void show(bool update_metrics, ToolbarSection::ToolbarInfo const & info) = 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);
Index: src/session.h
===================================================================
--- src/session.h (revision 15650)
+++ src/session.h (working copy)
@@ -238,6 +238,55 @@
};
+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(-1), posY(-1), location(-1) { }
+ ///
+ ToolbarInfo(bool v, int x, int y) :
+ empty(false), visible(v), posX(x), posY(y), location(-1) { }
+
+ 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.
+ int 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:
@@ -307,6 +356,12 @@
BookmarksSection const & bookmarks() const { return bookmarks_; }
///
+ ToolbarSection & toolbars() { return toolbars_; }
+
+ ///
+ ToolbarSection const & toolbars() const { return toolbars_; }
+
+ ///
SessionInfoSection & sessionInfo() { return session_info; }
///
@@ -336,6 +391,9 @@
BookmarksSection bookmarks_;
///
+ ToolbarSection toolbars_;
+
+ ///
SessionInfoSection session_info;
};