* \file QBrowseBox.C
*
* Original file taken from klyx 0.10 sources:
- * $Id: QBrowseBox.C,v 1.6 2002/10/20 01:48:27 larsbj Exp $
*
- * \author Kalle Dalheimer ?
+ * \author Kalle Dalheimer
*
* Full author contact details are available in file CREDITS
*/
#include <cmath>
-QBrowseBox::QBrowseBox(int rows, int cols)
- : QGridView()
+QBrowseBox::QBrowseBox(int rows, int cols, QWidget* parent, const char* name, WFlags f)
+ : QGridView(parent,name,f)
{
setNumRows(rows);
setNumCols(cols);
texts_ = new QString[rows * cols];
pixmaps_ = new QPixmap[rows * cols];
- activecell_.setX(0);
- activecell_.setY(0);
- updateCell(0, 0);
- setMouseTracking(true);
+ activecell_.setX(-1);
+ activecell_.setY(-1);
if (style().inherits("QWindowsStyle"))
setFrameStyle(QFrame::WinPanel | QFrame::Raised);
else
setFrameStyle(QFrame::Panel | QFrame::Raised);
- setFocusPolicy(QWidget::StrongFocus);
+ viewport()->setFocusPolicy(QWidget::StrongFocus);
+ // setMouseTracking must be called after setFocusPolicy
+ viewport()->setMouseTracking(true);
+ inloop=false;
+
}
}
-void QBrowseBox::insertItem(char const * text, int x, int y)
+void QBrowseBox::insertItem(char const * text, int row, int col)
{
- insertItem(QString(text), x, y);
+ insertItem(QString(text), row, col);
}
return texts_[coordsToIndex(row, col)];
}
-
QPixmap QBrowseBox::pixmap(int row, int col)
{
if (col < 0 || col >= numCols() || row < 0 || row >= numRows())
return pixmaps_[coordsToIndex(row, col)];
}
+int QBrowseBox::exec(const QPoint& pos)
+{
+ return exec(pos.x(),pos.y());
+}
+int QBrowseBox::exec(const QWidget* trigger)
+{
+ QPoint globalpos = trigger->parentWidget()->mapToGlobal( trigger->pos());
+ // is there enough space to put the box below the trigger?
+ if ( globalpos.y() + trigger->height()+height()+1<
+ QApplication::desktop()->height()) {
+ // is there enough space to set the box left-justified with the trigger
+ if (globalpos.x()+width()<QApplication::desktop()->width())
+ return exec(globalpos.x(),
+ globalpos.y()+trigger->height()+1);
+ else
+ return exec(globalpos.x()-width()-1,
+ globalpos.y()+trigger->height()+1);
+ } else {
+ if (globalpos.x()+width()<QApplication::desktop()->width())
+ return exec(globalpos.x(),
+ globalpos.y()-height()-1);
+ else
+ return exec(globalpos.x()-width()-1,
+ globalpos.y()-height()-1);
+ }
+}
+
+int QBrowseBox::exec(int x,int y)
+{
+ firstrelease_ = true;
+ move(x,y);
+ show();
+ repaint();
+ qApp->enter_loop();
+ inloop = true;
+
+ if (activecell_.x()!=-1 && activecell_.y()!=-1 )
+ return coordsToIndex( activecell_.x(),activecell_.y());
+ else
+ return -1;
+}
+
void QBrowseBox::keyPressEvent(QKeyEvent * e)
{
switch(e->key()) {
break;
case Key_Return:
emit selected(activecell_.x(), activecell_.y());
+ if ( isVisible() && parentWidget() &&
+ parentWidget()->inherits("QPopupMenu") )
+ parentWidget()->close();
+ else
+ close();
break;
+ case Key_Escape:
+ if (inloop)
+ qApp->exit_loop();
+ if ( isVisible() && parentWidget() &&
+ parentWidget()->inherits("QPopupMenu") )
+ parentWidget()->close();
default:
e->ignore();
}
}
-
-void QBrowseBox::mouseReleaseEvent(QMouseEvent *)
+void QBrowseBox::contentsMouseReleaseEvent(QMouseEvent *)
{
- qWarning("mouse release");
- emit selected( activecell_.x(), activecell_.y());
-}
+ if (firstrelease_)
+ firstrelease_ = false;
+ else {
+ emit selected( activecell_.x(), activecell_.y());
+ if ( isVisible() && parentWidget() &&
+ parentWidget()->inherits("QPopupMenu") )
+ parentWidget()->close();
+ }
+}
-//void QBrowseBox::closeEvent(QCloseEvent * e)
-//{
-// e->accept();
-// qApp->exit_loop();
-//}
+void QBrowseBox::closeEvent(QCloseEvent * e)
+{
+ e->accept();
+ qApp->exit_loop();
+}
void QBrowseBox::paintCell(QPainter * painter, int row, int col)
{
if (!texts_[coordsToIndex(row, col)].isEmpty()) {
painter->drawText(0, 0, cellWidth(),
- cellHeight(), AlignLeft,
+ cellHeight(), AlignCenter,
texts_[coordsToIndex(row, col)]);
}
painter->setClipping(false);
}
-void QBrowseBox::mouseMoveEvent(QMouseEvent * e)
+void QBrowseBox::contentsMouseMoveEvent(QMouseEvent * e)
{
- qWarning("mouseMoveEvent");
int x = e->pos().x();
int y = e->pos().y();
-
+
int cellx;
int celly;
cellx = -1;
celly = -1;
} else {
-#ifdef WITH_WARNINGS
-#warning Is the switch of x and y intended here? (Andre)
-#endif
celly = (int)floor( ((double)x) / ((double)cellWidth()) );
cellx = (int)floor( ((double)y) / ((double)cellHeight()) );
}
if (activecell_.x() != cellx || activecell_.y() != celly) {
- qWarning("update");
// mouse has been moved to another cell
int oldactivecellx = activecell_.x();
int oldactivecelly = activecell_.y();
if (y>0)
activecell_.setY(y - 1);
+ else if (parentWidget())
+ QWidget::focusNextPrevChild(false);
updateCell(activecell_.x(), y);
updateCell(activecell_.x(), activecell_.y());
if (x > 0)
activecell_.setX(x - 1);
+ else if (parentWidget())
+ QWidget::focusNextPrevChild(false);
updateCell(x, activecell_.y());
updateCell(activecell_.x(), activecell_.y());