#include "QLyXKeySym.h"
#include "qt_helpers.h"
+#include "gettext.h"
#include "LyXView.h"
#include "BufferView.h"
#include "support/filetools.h" // LibFileSearch
#include "support/os.h"
+#include "support/convert.h"
#include "graphics/GraphicsImage.h"
#include "graphics/GraphicsLoader.h"
#include <boost/bind.hpp>
#include <boost/current_function.hpp>
-// Abdel (26/06/2006):
-// On windows-XP the UserGuide PageDown scroll test is faster without event pruning (16 s)
-// than with it (23 s).
#ifdef Q_WS_WIN
int const CursorWidth = 2;
- #define USE_EVENT_PRUNING 0
#else
int const CursorWidth = 1;
- #define USE_EVENT_PRUNING 0
#endif
namespace lyx {
+using support::FileName;
+
/// return the LyX key state from Qt's
static key_modifier::state q_key_state(Qt::KeyboardModifiers state)
{
cursor_ = new frontend::CursorWidget();
cursor_->hide();
- setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+ setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setAcceptDrops(true);
+ setMouseTracking(true);
setMinimumSize(100, 70);
- //viewport()->setAutoFillBackground(false);
- //viewport()->setAttribute(Qt::WA_OpaquePaintEvent);
+ viewport()->setAutoFillBackground(false);
+ // We don't need double-buffering nor SystemBackground on
+ // the viewport because we have our own backing pixmap.
+ viewport()->setAttribute(Qt::WA_NoSystemBackground);
+
setFocusPolicy(Qt::WheelFocus);
viewport()->setCursor(Qt::IBeamCursor);
<< "\n viewport height\t" << viewport()->height()
<< endl;
- if (USE_EVENT_PRUNING) {
- // This is the keyboard buffering stuff...
- // I don't see any need for this under windows. The keyboard is reactive
- // enough...
-
- if ( !QObject::connect(&step_timer_, SIGNAL(timeout()),
- this, SLOT(keyeventTimeout())) )
- lyxerr[Debug::GUI] << "ERROR: keyeventTimeout cannot connect!" << endl;
-
- // Start the timer, one-shot.
- step_timer_.setSingleShot(true);
- step_timer_.start(50);
- }
-
// Enables input methods for asian languages.
// Must be set when creating custom text editing widgets.
setAttribute(Qt::WA_InputMethodEnabled, true);
void GuiWorkArea::setScrollbarParams(int h, int scroll_pos, int scroll_line_step)
{
+ if (verticalScrollBarPolicy() != Qt::ScrollBarAlwaysOn)
+ setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+
verticalScrollBar()->setTracking(false);
// do what cursor movement does (some grey)
void GuiWorkArea::focusInEvent(QFocusEvent * /*event*/)
{
// No need to do anything if we didn't change views...
- if (&lyx_view_ == &theApp->currentView())
- return;
+// if (theApp() == 0 || &lyx_view_ == theApp()->currentView())
+// return;
- theApp->setCurrentView(lyx_view_);
+ theApp()->setCurrentView(lyx_view_);
// FIXME: it would be better to send a signal "newBuffer()"
// in BufferList that could be connected to the different tabbars.
lyx_view_.updateTab();
startBlinkingCursor();
-
- //FIXME: Use case: Two windows share the same buffer.
- // The first window is resize. This modify the inner Buffer
- // structure because Paragraph has a notion of line break and
- // thus line width (this is very bad!).
- // When switching to the other window which does not have the
- // same size, LyX crashes because the line break is not adapted
- // the this BufferView width.
- // The following line fix the crash by resizing the BufferView
- // on a focusInEvent(). That is not a good fix but it is a fix
- // nevertheless. The bad side effect is that when the two
- // BufferViews show the same portion of the Buffer, the second
- // BufferView will show the same line breaks as the first one;
- // even though those line breaks are not adapted to the second
- // BufferView width... such is life!
- resizeBufferView();
}
void GuiWorkArea::focusOutEvent(QFocusEvent * /*event*/)
{
- // No need to do anything if we didn't change views...
- if (&lyx_view_ == &theApp->currentView())
- return;
-
stopBlinkingCursor();
}
<< " key=" << e->key()
<< endl;
- if (USE_EVENT_PRUNING) {
- keyeventQueue_.push(boost::shared_ptr<QKeyEvent>(new QKeyEvent(*e)));
- }
- else {
- boost::shared_ptr<QLyXKeySym> sym(new QLyXKeySym);
- sym->set(e);
- processKeySym(sym, q_key_state(e->modifiers()));
- }
-}
-
-
-// This is used only if USE_EVENT_PRUNING is defined...
-void GuiWorkArea::keyeventTimeout()
-{
- bool handle_autos = true;
-
- while (!keyeventQueue_.empty()) {
- boost::shared_ptr<QKeyEvent> ev = keyeventQueue_.front();
-
- // We never handle more than one auto repeated
- // char in a list of queued up events.
- if (!handle_autos && ev->isAutoRepeat()) {
- keyeventQueue_.pop();
- continue;
- }
-
- boost::shared_ptr<QLyXKeySym> sym(new QLyXKeySym);
- sym->set(ev.get());
-
- lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION
- << " count=" << ev->count()
- << " text=" << fromqstr(ev->text())
- << " isAutoRepeat=" << ev->isAutoRepeat()
- << " key=" << ev->key()
- << endl;
-
- processKeySym(sym, q_key_state(ev->modifiers()));
- keyeventQueue_.pop();
-
- handle_autos = false;
- }
-
- // Restart the timer.
- step_timer_.setSingleShot(true);
- step_timer_.start(25);
+ boost::shared_ptr<QLyXKeySym> sym(new QLyXKeySym);
+ sym->set(e);
+ processKeySym(sym, q_key_state(e->modifiers()));
}
void GuiWorkArea::update(int x, int y, int w, int h)
{
- viewport()->update(x, y, w, h);
+ viewport()->repaint(x, y, w, h);
}
void GuiWorkArea::doGreyOut(QLPainter & pain)
{
+ setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+
pain.fillRectangle(0, 0, width(), height(),
LColor::bottomarea);
//if (!lyxrc.show_banner)
// return;
- lyxerr << "show banner: " << lyxrc.show_banner << endl;
+ lyxerr[Debug::GUI] << "show banner: " << lyxrc.show_banner << endl;
/// The text to be written on top of the pixmap
- string const text = lyx_version ? lyx_version : "unknown";
- string const file = support::libFileSearch("images", "banner", "ppm");
+ QString const text = lyx_version ? QString(lyx_version) : qt_("unknown version");
+ FileName const file = support::libFileSearch("images", "banner", "ppm");
if (file.empty())
return;
- QPixmap pm(toqstr(file));
+ QPixmap pm(toqstr(file.absFilename()));
if (!pm) {
lyxerr << "could not load splash screen: '" << file << "'" << endl;
return;
// The font used to display the version info
font.setStyleHint(QFont::SansSerif);
font.setWeight(QFont::Bold);
- font.setPointSize(LyXFont::SIZE_NORMAL);
+ font.setPointSize(convert<int>(lyxrc.font_sizes[LyXFont::SIZE_LARGE]));
int const w = pm.width();
int const h = pm.height();
pain.drawPixmap(x, y, pm);
- x += 260;
+ x += 300;
y += 265;
pain.setPen(QColor(255, 255, 0));
pain.setFont(font);
- pain.drawText(x, y, toqstr(text));
+ pain.drawText(x, y, text);
}
void GuiWorkArea::paintEvent(QPaintEvent * ev)
{
QRect const rc = ev->rect();
+ /*
lyxerr[Debug::PAINTING] << "paintEvent begin: x: " << rc.x()
<< " y: " << rc.y()
<< " w: " << rc.width()
<< " h: " << rc.height() << endl;
+ */
QPainter pain(viewport());
pain.drawPixmap(rc, screen_, rc);
QLPainter pain(&screen_);
if (greyed_out_) {
- lyxerr << "splash screen requested" << endl;
+ lyxerr[Debug::GUI] << "splash screen requested" << endl;
doGreyOut(pain);
verticalScrollBar()->hide();
update(0, 0, width(), height());