* completion cursor

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@23312 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Stefan Schimanski 2008-02-28 12:41:43 +00:00
parent 0ca318af55
commit 7e2c8ea4ff
4 changed files with 86 additions and 58 deletions

View File

@ -234,6 +234,12 @@ bool GuiCompleter::inlinePossible(Cursor const & cur) const
} }
bool GuiCompleter::completionAvailable() const
{
return popup()->model()->rowCount() > 0;
}
bool GuiCompleter::popupVisible() const bool GuiCompleter::popupVisible() const
{ {
return popup()->isVisible(); return popup()->isVisible();
@ -455,6 +461,9 @@ void GuiCompleter::hidePopup(Cursor & cur)
popup()->hide(); popup()->hide();
if (popup_timer_.isActive()) if (popup_timer_.isActive())
popup_timer_.stop(); popup_timer_.stop();
if (!inlineVisible())
setModel(new GuiCompletionModel(this, 0));
} }
@ -471,6 +480,9 @@ void GuiCompleter::hideInline(Cursor & cur)
{ {
gui_->bufferView().setInlineCompletion(cur, DocIterator(), docstring()); gui_->bufferView().setInlineCompletion(cur, DocIterator(), docstring());
inlineVisible_ = false; inlineVisible_ = false;
if (!popupVisible())
setModel(new GuiCompletionModel(this, 0));
} }

View File

@ -51,6 +51,8 @@ public:
bool popupPossible(Cursor const & cur) const; bool popupPossible(Cursor const & cur) const;
/// ///
bool inlinePossible(Cursor const & cur) const; bool inlinePossible(Cursor const & cur) const;
///
bool completionAvailable() const;
/// Activate the current completion, i.e. finalize it. /// Activate the current completion, i.e. finalize it.
void activate(); void activate();
/// Do a completion as far as it is unique, but at least one character. /// Do a completion as far as it is unique, but at least one character.

View File

@ -68,6 +68,7 @@ int const CursorWidth = 2;
#else #else
int const CursorWidth = 1; int const CursorWidth = 1;
#endif #endif
int const TabIndicatorWidth = 4;
#undef KeyPress #undef KeyPress
#undef NoModifier #undef NoModifier
@ -121,48 +122,63 @@ public:
void draw(QPainter & painter) void draw(QPainter & painter)
{ {
if (show_ && rect_.isValid()) { if (!show_ || !rect_.isValid())
switch (shape_) { return;
case L_SHAPE:
painter.fillRect(rect_.x(), rect_.y(), int l = x_ - rect_.left();
CursorWidth, rect_.height(), color_); int r = rect_.right() - x_;
int h = rect_.height();
painter.fillRect(x_, y_, CursorWidth, h, color_);
painter.setPen(color_); painter.setPen(color_);
painter.drawLine(rect_.bottomLeft().x() + CursorWidth, if (l_shape_) {
rect_.bottomLeft().y(), if (rtl_)
rect_.bottomRight().x(), rect_.bottomLeft().y()); painter.drawLine(x_, y_ + h, x_ - l, y_ + h);
break; else
painter.drawLine(x_ + CursorWidth, y_ + h,
x_ + CursorWidth + r, y_ + h);
}
case REVERSED_L_SHAPE: if (completable_) {
painter.fillRect(rect_.x() + rect_.height() / 3, rect_.y(), int m = y_ + h / 2;
CursorWidth, rect_.height(), color_); int d = TabIndicatorWidth - 1;
painter.setPen(color_); if (rtl_) {
painter.drawLine(rect_.bottomRight().x() - CursorWidth, painter.drawLine(x_ - 1 , m - d, x_ - d - 1, m);
rect_.bottomLeft().y(), painter.drawLine(x_ - 1 , m + d, x_ - d - 1, m);
rect_.bottomLeft().x(), rect_.bottomLeft().y()); } else {
break; painter.drawLine(x_ + CursorWidth , m - d, x_ + d + CursorWidth, m);
painter.drawLine(x_ + CursorWidth , m + d, x_ + d + CursorWidth, m);
default:
painter.fillRect(rect_, color_);
break;
} }
} }
} }
void update(int x, int y, int h, CursorShape shape) void update(int x, int y, int h, bool l_shape,
bool rtl, bool completable)
{ {
color_ = guiApp->colorCache().get(Color_cursor); color_ = guiApp->colorCache().get(Color_cursor);
shape_ = shape; l_shape_ = l_shape;
switch (shape) { rtl_ = rtl;
case L_SHAPE: completable_ = completable;
rect_ = QRect(x, y, CursorWidth + h / 3, h); x_ = x;
break; y_ = y;
case REVERSED_L_SHAPE: int l = 0;
rect_ = QRect(x - h / 3, y, CursorWidth + h / 3, h); int r = 0;
break;
default: if (l_shape_) {
rect_ = QRect(x, y, CursorWidth, h); if (rtl)
break; l += h / 3;
else
r += h / 3;
} }
if (completable_) {
if (rtl)
l = max(r, TabIndicatorWidth);
else
r = max(l, TabIndicatorWidth);
}
rect_ = QRect(x - l, y, CursorWidth + r + l, h);
} }
void show(bool set_show = true) { show_ = set_show; } void show(bool set_show = true) { show_ = set_show; }
@ -172,13 +188,21 @@ public:
private: private:
/// ///
CursorShape shape_; bool rtl_;
///
bool l_shape_;
///
bool completable_;
/// ///
bool show_; bool show_;
/// ///
QColor color_; QColor color_;
/// ///
QRect rect_; QRect rect_;
///
int x_;
///
int y_;
}; };
@ -432,22 +456,19 @@ void GuiWorkArea::showCursor()
if (cursor_visible_) if (cursor_visible_)
return; return;
CursorShape shape = BAR_SHAPE; // RTL or not RTL
bool l_shape = false;
Font const & realfont = buffer_view_->cursor().real_current_font; Font const & realfont = buffer_view_->cursor().real_current_font;
BufferParams const & bp = buffer_view_->buffer().params(); BufferParams const & bp = buffer_view_->buffer().params();
bool const samelang = realfont.language() == bp.language; bool const samelang = realfont.language() == bp.language;
bool const isrtl = realfont.isVisibleRightToLeft(); bool const isrtl = realfont.isVisibleRightToLeft();
if (!samelang || isrtl != bp.language->rightToLeft()) { if (!samelang || isrtl != bp.language->rightToLeft())
shape = L_SHAPE; l_shape = true;
if (isrtl)
shape = REVERSED_L_SHAPE;
}
// The ERT language hack needs fixing up // The ERT language hack needs fixing up
if (realfont.language() == latex_language) if (realfont.language() == latex_language)
shape = BAR_SHAPE; l_shape = false;
Font const font = buffer_view_->cursor().getFont(); Font const font = buffer_view_->cursor().getFont();
FontMetrics const & fm = theFontMetrics(font); FontMetrics const & fm = theFontMetrics(font);
@ -466,9 +487,10 @@ void GuiWorkArea::showCursor()
cursorInView = false; cursorInView = false;
// show cursor on screen // show cursor on screen
bool completable = completer_.completionAvailable();
if (cursorInView) { if (cursorInView) {
cursor_visible_ = true; cursor_visible_ = true;
showCursor(x, y, h, shape); showCursor(x, y, h, l_shape, isrtl, completable);
} }
} }
@ -849,7 +871,8 @@ void GuiWorkArea::updateScreen()
} }
void GuiWorkArea::showCursor(int x, int y, int h, CursorShape shape) void GuiWorkArea::showCursor(int x, int y, int h,
bool l_shape, bool rtl, bool completable)
{ {
if (schedule_redraw_) { if (schedule_redraw_) {
buffer_view_->updateMetrics(); buffer_view_->updateMetrics();
@ -862,7 +885,7 @@ void GuiWorkArea::showCursor(int x, int y, int h, CursorShape shape)
return; return;
} }
cursor_->update(x, y, h, shape); cursor_->update(x, y, h, l_shape, rtl, completable);
cursor_->show(); cursor_->show();
viewport()->update(cursor_->rect()); viewport()->update(cursor_->rect());
} }

View File

@ -50,16 +50,6 @@ namespace frontend {
class GuiView; class GuiView;
class GuiWorkArea; class GuiWorkArea;
/// types of cursor in work area
enum CursorShape {
/// normal I-beam
BAR_SHAPE,
/// L-shape for locked insets of a different language
L_SHAPE,
/// reverse L-shape for RTL text
REVERSED_L_SHAPE
};
/// for emulating triple click /// for emulating triple click
class DoubleClick { class DoubleClick {
public: public:
@ -167,7 +157,8 @@ private:
void updateScreen(); void updateScreen();
/// paint the cursor and store the background /// paint the cursor and store the background
virtual void showCursor(int x, int y, int h, CursorShape shape); virtual void showCursor(int x, int y, int h,
bool l_shape, bool rtl, bool completable);
/// hide the cursor /// hide the cursor
virtual void removeCursor(); virtual void removeCursor();