/**
* \file iconpalette.C
- * Copyright 2001 the LyX Team
- * Read the file COPYING
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
* \author John Levon
+ *
+ * Full author contact details are available in file CREDITS
*/
#include <config.h>
+
#include "debug.h"
-
+
#include "iconpalette.h"
+#include "qt_helpers.h"
#include <qlayout.h>
#include <qpushbutton.h>
#include <qtooltip.h>
using std::endl;
-
+using std::make_pair;
+using std::vector;
+using std::max;
+
+int const button_size = 40;
+
+
IconPalette::IconPalette(QWidget * parent, char const * name)
- : QWidget(parent, name), crow_(0), ccol_(0)
+ : QWidget(parent, name), maxcol_(-1)
{
QVBoxLayout * top = new QVBoxLayout(this);
QHBoxLayout * row = new QHBoxLayout(top);
void IconPalette::add(QPixmap const & pixmap, string name, string tooltip)
{
QPushButton * p = new QPushButton(this);
- p->setFixedSize(40, 40);
+ p->setFixedSize(button_size, button_size);
p->setPixmap(pixmap);
- QToolTip::add(p, tooltip.c_str());
- layout_->addWidget(p, crow_, ccol_);
- if (++ccol_ == 5) {
- ccol_ = 0;
- ++crow_;
- }
- resize(5 * 40, crow_ * 40);
- button_map_[p] = name;
- connect(p, SIGNAL(clicked()), this, SLOT(clicked()));
+ QToolTip::add(p, toqstr(tooltip));
+ connect(p, SIGNAL(clicked()), this, SLOT(clicked()));
+ buttons_.push_back(make_pair(p, name));
}
void IconPalette::clicked()
{
- string name = button_map_[(QPushButton*)(sender())];
- emit button_clicked(name);
+ vector<Button>::const_iterator it(buttons_.begin());
+ vector<Button>::const_iterator const end(buttons_.end());
+ for (; it != end; ++it) {
+ if (sender() == it->first) {
+ emit button_clicked(it->second);
+ return;
+ }
+ }
}
void IconPalette::resizeEvent(QResizeEvent * e)
{
- lyxerr << "resize panel to " << e->size().width() << "," << e->size().height() << endl;
+ QWidget::resizeEvent(e);
+
+ lyxerr[Debug::GUI] << "resize panel to "
+ << e->size().width() << ',' << e->size().height() << endl;
+
+ int maxcol = e->size().width() / button_size;
+
+ if (!layout_->isEmpty() && maxcol == maxcol_)
+ return;
+
+ int cols(width() / button_size);
+ int rows = max(int(buttons_.size() / cols), 1);
+ if (buttons_.size() % cols)
+ ++rows;
+
+ lyxerr[Debug::GUI] << "Laying out " << buttons_.size() << " widgets in a "
+ << cols << 'x' << rows << " grid." << endl;
+
+ setUpdatesEnabled(false);
+
+ // clear layout
+ QLayoutIterator lit = layout_->iterator();
+ while (lit.current()) {
+ lit.takeCurrent();
+ }
+
+ layout_->invalidate();
+
+ vector<Button>::const_iterator it(buttons_.begin());
+ vector<Button>::const_iterator const end(buttons_.end());
+
+ for (int i = 0; i < rows; ++i) {
+ for (int j = 0; j < cols; ++j) {
+ layout_->addWidget(it->first, i, j);
+ ++it;
+ if (it == end)
+ goto out;
+ }
+ }
+
+out:
+
+ resize(cols * button_size, rows * button_size);
+
+ maxcol_ = cols;
+
+ setUpdatesEnabled(true);
+ update();
}