Browse Source

Fixes #374 and #340: Copy/Cut copies/cut the current line if text is not selected. Can now also copy text from tooltips.

merge-requests/382/head
eidheim 8 years ago
parent
commit
e0efbb112d
  1. 2
      src/terminal.cc
  2. 18
      src/tooltips.cc
  3. 6
      src/tooltips.h
  4. 66
      src/window.cc

2
src/terminal.cc

@ -9,6 +9,8 @@
#include <thread>
Terminal::Terminal() {
set_editable(false);
bold_tag=get_buffer()->create_tag();
bold_tag->property_weight()=Pango::WEIGHT_ULTRAHEAVY;

18
src/tooltips.cc

@ -1,6 +1,7 @@
#include "tooltips.h"
#include "selection_dialog.h"
std::set<Tooltip*> Tooltips::shown_tooltips;
Gdk::Rectangle Tooltips::drawn_tooltips_rectangle=Gdk::Rectangle();
Tooltip::Tooltip(std::function<Glib::RefPtr<Gtk::TextBuffer>()> create_tooltip_buffer, Gtk::TextView *text_view,
@ -8,6 +9,7 @@ Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark, Glib::RefPtr<Gtk::TextBuffer::Ma
: start_mark(start_mark), end_mark(end_mark), create_tooltip_buffer(create_tooltip_buffer), text_view(text_view) {}
Tooltip::~Tooltip() {
Tooltips::shown_tooltips.erase(this);
if(text_view) {
text_view->get_buffer()->delete_mark(start_mark);
text_view->get_buffer()->delete_mark(end_mark);
@ -34,6 +36,8 @@ void Tooltip::update() {
}
void Tooltip::show(bool disregard_drawn) {
Tooltips::shown_tooltips.emplace(this);
if(!window) {
//init window
window=std::make_unique<Gtk::Window>(Gtk::WindowType::WINDOW_POPUP);
@ -60,9 +64,9 @@ void Tooltip::show(bool disregard_drawn) {
box->get_style_context()->add_class("juci_tooltip_box");
window->add(*box);
auto buffer=create_tooltip_buffer();
wrap_lines(buffer);
auto tooltip_text_view=Gtk::manage(new Gtk::TextView(buffer));
text_buffer=create_tooltip_buffer();
wrap_lines();
auto tooltip_text_view=Gtk::manage(new Gtk::TextView(text_buffer));
tooltip_text_view->set_editable(false);
if(text_view) {
@ -75,7 +79,7 @@ void Tooltip::show(bool disregard_drawn) {
box->add(*tooltip_text_view);
auto layout=Pango::Layout::create(tooltip_text_view->get_pango_context());
layout->set_text(buffer->get_text());
layout->set_text(text_buffer->get_text());
layout->get_pixel_size(size.first, size.second);
size.first+=6; // 2xpadding
size.second+=8; // 2xpadding + 2
@ -139,11 +143,15 @@ void Tooltip::show(bool disregard_drawn) {
}
void Tooltip::hide() {
Tooltips::shown_tooltips.erase(this);
if(window)
window->hide();
}
void Tooltip::wrap_lines(Glib::RefPtr<Gtk::TextBuffer> text_buffer) {
void Tooltip::wrap_lines() {
if(!text_buffer)
return;
auto iter=text_buffer->begin();
while(iter) {

6
src/tooltips.h

@ -3,6 +3,7 @@
#include <string>
#include <list>
#include <functional>
#include <set>
class Tooltip {
public:
@ -17,9 +18,11 @@ public:
Gdk::Rectangle activation_rectangle;
Glib::RefPtr<Gtk::TextBuffer::Mark> start_mark;
Glib::RefPtr<Gtk::TextBuffer::Mark> end_mark;
Glib::RefPtr<Gtk::TextBuffer> text_buffer;
private:
std::unique_ptr<Gtk::Window> window;
void wrap_lines(Glib::RefPtr<Gtk::TextBuffer> text_buffer);
void wrap_lines();
std::function<Glib::RefPtr<Gtk::TextBuffer>()> create_tooltip_buffer;
Gtk::TextView *text_view;
@ -29,6 +32,7 @@ private:
class Tooltips {
public:
static std::set<Tooltip*> shown_tooltips;
static void init() {drawn_tooltips_rectangle=Gdk::Rectangle();}
void show(const Gdk::Rectangle& rectangle, bool disregard_drawn=false);
void show(bool disregard_drawn=false);

66
src/window.cc

@ -391,27 +391,73 @@ void Window::set_menu_actions() {
auto widget=get_focus();
if(auto entry=dynamic_cast<Gtk::Entry*>(widget))
entry->cut_clipboard();
else if(auto view=Notebook::get().get_current_view()) {
view->disable_spellcheck=true;
view->get_buffer()->cut_clipboard(Gtk::Clipboard::get());
view->disable_spellcheck=false;
else if(auto view=dynamic_cast<Gtk::TextView*>(widget)) {
auto source_view=dynamic_cast<Source::View*>(view);
if(source_view)
source_view->disable_spellcheck=true;
if(!view->get_buffer()->get_has_selection()) {
auto start=view->get_buffer()->get_iter_at_line(view->get_buffer()->get_insert()->get_iter().get_line());
auto end=start;
if(!end.ends_line())
end.forward_to_line_end();
end.forward_char();
if(!end.starts_line()) // In case of \r\n
end.forward_char();
Gtk::Clipboard::get()->set_text(view->get_buffer()->get_text(start, end));
if(view->get_editable())
view->get_buffer()->erase(start, end);
}
else {
if(view->get_editable())
view->get_buffer()->cut_clipboard(Gtk::Clipboard::get());
else
view->get_buffer()->copy_clipboard(Gtk::Clipboard::get());
}
if(source_view)
source_view->disable_spellcheck=false;
}
});
menu.add_action("edit_copy", [this]() {
// Copy from a tooltip if it has selected text
for(auto tooltip: Tooltips::shown_tooltips) {
auto buffer=tooltip->text_buffer;
if(buffer && buffer->get_has_selection()) {
buffer->copy_clipboard(Gtk::Clipboard::get());
return;
}
}
auto widget=get_focus();
if(auto entry=dynamic_cast<Gtk::Entry*>(widget))
entry->copy_clipboard();
else if(auto text_view=dynamic_cast<Gtk::TextView*>(widget))
text_view->get_buffer()->copy_clipboard(Gtk::Clipboard::get());
else if(auto view=dynamic_cast<Gtk::TextView*>(widget)) {
if(!view->get_buffer()->get_has_selection()) {
auto start=view->get_buffer()->get_iter_at_line(view->get_buffer()->get_insert()->get_iter().get_line());
auto end=start;
if(!end.ends_line())
end.forward_to_line_end();
end.forward_char();
if(!end.starts_line()) // In case of \r\n
end.forward_char();
Gtk::Clipboard::get()->set_text(view->get_buffer()->get_text(start, end));
}
else
view->get_buffer()->copy_clipboard(Gtk::Clipboard::get());
}
});
menu.add_action("edit_paste", [this]() {
auto widget=get_focus();
if(auto entry=dynamic_cast<Gtk::Entry*>(widget))
entry->paste_clipboard();
else if(auto view=Notebook::get().get_current_view()) {
view->disable_spellcheck=true;
view->paste();
view->disable_spellcheck=false;
else if(auto view=dynamic_cast<Gtk::TextView*>(widget)) {
auto source_view=dynamic_cast<Source::View*>(view);
if(source_view) {
source_view->disable_spellcheck=true;
source_view->paste();
source_view->disable_spellcheck=false;
}
else if(view->get_editable())
view->get_buffer()->paste_clipboard(Gtk::Clipboard::get());
}
});

Loading…
Cancel
Save