#include "insets/InsetGraphics.h"
#include "insets/InsetRef.h"
#include "insets/InsetText.h"
+#include "insets/InsetNote.h"
#include "frontends/alert.h"
#include "frontends/Application.h"
// If the offset is less than 2 screen height, prefer to scroll instead.
if (abs(offset) <= 2 * height_) {
scroll(offset);
+ updateMetrics();
+ buffer_.changed();
return;
}
int ypos = pm.position() + offset;
Dimension const & row_dim =
pm.getRow(cs.pos(), dit.boundary()).dimension();
+ int scrolled = 0;
if (ypos - row_dim.ascent() < 0)
- scrollUp(- ypos + row_dim.ascent());
+ scrolled = scrollUp(- ypos + row_dim.ascent());
else if (ypos + row_dim.descent() > height_)
- scrollDown(ypos - height_ + row_dim.descent());
+ scrolled = scrollDown(ypos - height_ + row_dim.descent());
// else, nothing to do, the cursor is already visible so we just return.
+ if (scrolled != 0) {
+ updateMetrics();
+ buffer_.changed();
+ }
return;
}
case LFUN_SCREEN_RECENTER:
case LFUN_BIBTEX_DATABASE_ADD:
case LFUN_BIBTEX_DATABASE_DEL:
+ case LFUN_GRAPHICS_GROUPS_UNIFY:
+ case LFUN_NOTES_MUTATE:
+ case LFUN_ALL_INSETS_TOGGLE:
case LFUN_STATISTICS:
flag.setEnabled(true);
break;
showCursor();
p = getPos(cur, cur.boundary());
}
- scroll(cmd.action == LFUN_SCREEN_UP? - height_ : height_);
+ int const scrolled = scroll(cmd.action == LFUN_SCREEN_UP
+ ? - height_ : height_);
+ if (cmd.action == LFUN_SCREEN_UP && scrolled > - height_)
+ p = Point(0, 0);
+ if (cmd.action == LFUN_SCREEN_DOWN && scrolled < height_)
+ p = Point(width_, height_);
cur.reset(buffer_.inset());
+ updateMetrics();
+ buffer_.changed();
d->text_metrics_[&buffer_.text()].editXY(cur, p.x_, p.y_);
//FIXME: what to do with cur.x_target()?
cur.finishUndo();
processUpdateFlags(Update::Force);
break;
+ // These two could be rewriten using some command like forall <insetname> <command>
+ // once the insets refactoring is done.
+ case LFUN_GRAPHICS_GROUPS_UNIFY: {
+ if (cmd.argument().empty())
+ break;
+ //view()->cursor().recordUndoFullDocument(); let inset-apply do that job
+ graphics::unifyGraphicsGroups(cur.buffer(), to_utf8(cmd.argument()));
+ processUpdateFlags(Update::Force | Update::FitCursor);
+ break;
+ }
+
+ case LFUN_NOTES_MUTATE: {
+ if (cmd.argument().empty())
+ break;
+ cur.recordUndoFullDocument();
+
+ if (mutateNotes(cur, cmd.getArg(0), cmd.getArg(1))) {
+ processUpdateFlags(Update::Force);
+ }
+ break;
+ }
+
+ case LFUN_ALL_INSETS_TOGGLE: {
+ string action;
+ string const name = split(to_utf8(cmd.argument()), action, ' ');
+ InsetCode const inset_code = insetCode(name);
+
+ FuncRequest fr(LFUN_INSET_TOGGLE, action);
+
+ Inset & inset = cur.buffer().inset();
+ InsetIterator it = inset_iterator_begin(inset);
+ InsetIterator const end = inset_iterator_end(inset);
+ for (; it != end; ++it) {
+ if (!it->asInsetMath()
+ && (inset_code == NO_CODE
+ || inset_code == it->lyxCode())) {
+ Cursor tmpcur = cur;
+ tmpcur.pushBackward(*it);
+ it->dispatch(tmpcur, fr);
+ }
+ }
+ processUpdateFlags(Update::Force | Update::FitCursor);
+ break;
+ }
+
default:
return false;
}
if (scroll_value)
scroll(scroll_step * scroll_value);
}
+ updateMetrics();
+ buffer_.changed();
}
-void BufferView::scroll(int y)
+int BufferView::scroll(int y)
{
if (y > 0)
- scrollDown(y);
- else if (y < 0)
- scrollUp(-y);
+ return scrollDown(y);
+ if (y < 0)
+ return scrollUp(-y);
+ return 0;
}
-void BufferView::scrollDown(int offset)
+int BufferView::scrollDown(int offset)
{
Text * text = &buffer_.text();
TextMetrics & tm = d->text_metrics_[text];
int bottom_pos = last.second->position() + last.second->descent();
if (last.first + 1 == int(text->paragraphs().size())) {
if (bottom_pos <= height_)
- return;
+ return 0;
offset = min(offset, bottom_pos - height_);
break;
}
tm.newParMetricsDown();
}
d->anchor_ypos_ -= offset;
- updateMetrics();
- buffer_.changed();
+ return -offset;
}
-void BufferView::scrollUp(int offset)
+int BufferView::scrollUp(int offset)
{
Text * text = &buffer_.text();
TextMetrics & tm = d->text_metrics_[text];
int top_pos = first.second->position() - first.second->ascent();
if (first.first == 0) {
if (top_pos >= 0)
- return;
+ return 0;
offset = min(offset, - top_pos);
break;
}
tm.newParMetricsUp();
}
d->anchor_ypos_ += offset;
- updateMetrics();
- buffer_.changed();
+ return offset;
}