30 #ifndef CRN_USING_GTKMM3
31 using namespace GtkCRN;
33 const crn::String Alto::pageList(U
"nimrod::4pages");
34 const crn::String Alto::spaceList(U
"nimrod::3spaces");
35 const crn::String Alto::blockList(U
"nimrod::2blocks");
36 const crn::String Alto::lineList(U
"nimrod::1lines");
37 const crn::String Alto::wordList(U
"nimrod::0words");
40 actions(Gtk::ActionGroup::create(
"alto display")),
45 actions->add(Gtk::ToggleAction::create(
"alto-pages", Gtk::StockID(
"gtk-crn-view"),
_(
"Show/hide _pages"),
_(
"Show/hide pages")), sigc::mem_fun(
this, &Alto::show_hide_pages));
46 actions->add(Gtk::ToggleAction::create(
"alto-spaces", Gtk::StockID(
"gtk-crn-block"),
_(
"Show/hide _spaces"),
_(
"Show/hide spaces")), sigc::mem_fun(
this, &Alto::show_hide_spaces));
47 actions->add(Gtk::ToggleAction::create(
"alto-textblocks", Gtk::StockID(
"gtk-crn-block"),
_(
"Show/hide _text blocks"),
_(
"Show/hide text blocks")), sigc::mem_fun(
this, &Alto::show_hide_blocks));
48 actions->add(Gtk::ToggleAction::create(
"alto-textlines", Gtk::StockID(
"gtk-crn-block"),
_(
"Show/hide text _lines"),
_(
"Show/hide text lines")), sigc::mem_fun(
this, &Alto::show_hide_lines));
49 actions->add(Gtk::ToggleAction::create(
"alto-words", Gtk::StockID(
"gtk-crn-block"),
_(
"Show/hide _words"),
_(
"Show/hide words")), sigc::mem_fun(
this, &Alto::show_hide_words));
50 actions->add(Gtk::ToggleAction::create(
"alto-edit", Gtk::Stock::EDIT,
_(
"_Edit alto"),
_(
"Edit alto")), sigc::mem_fun(
this, &Alto::toggle_edit));
51 Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(actions->get_action(
"alto-edit"))->set_active(
false);
103 pack_start(doc,
true,
true, 0);
117 void Alto::on_view_changed()
121 textblockgroup.clear();
122 textlinegroup.clear();
127 void Alto::update_boxes()
134 current_alto =
nullptr;
144 if (vid.IsNotEmpty())
147 const std::vector<crn::xml::Id> pages(aview.GetPages());
152 const std::vector<crn::xml::Id> spaces(apage.GetSpaces());
157 const std::vector<crn::xml::Id> blocks(aspace.GetTextBlocks());
162 const std::vector<crn::xml::Id> lines(ablock.GetTextLines());
167 const std::vector<crn::xml::Id> words(aline.GetWords());
181 void Alto::show_hide_pages()
183 showpages = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(actions->get_action(
"alto-pages"))->get_active();
187 void Alto::show_hide_spaces()
189 showspaces = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(actions->get_action(
"alto-spaces"))->get_active();
193 void Alto::show_hide_blocks()
195 showtextblocks = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(actions->get_action(
"alto-textblocks"))->get_active();
199 void Alto::show_hide_lines()
201 showtextlines = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(actions->get_action(
"alto-textlines"))->get_active();
205 void Alto::show_hide_words()
207 showwords = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(actions->get_action(
"alto-words"))->get_active();
211 void Alto::toggle_edit()
213 edit_mode = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(actions->get_action(
"alto-edit"))->get_active();
222 void Alto::on_rmb_clicked(guint mouse_button, guint32 time, std::vector<std::pair<crn::String, crn::String> > overlay_items_under_mouse,
int x,
int y)
224 if (edit_mode && current_alto->GetLayout().GetPages().empty())
226 popup.reset(
new Gtk::Menu);
227 Gtk::MenuItem *mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Create page")));
228 mit->signal_activate().connect(sigc::mem_fun(
this, &Alto::add_page));
231 popup->popup(mouse_button, time);
234 if (edit_mode && !overlay_items_under_mouse.empty())
238 for (std::vector<std::pair<crn::String, crn::String> >::iterator it = overlay_items_under_mouse.begin(); it != overlay_items_under_mouse.end(); ++it)
240 if ((it->first == pageList) && showpages)
242 else if ((it->first == spaceList) && showspaces)
244 else if ((it->first == blockList) && showtextblocks)
246 else if ((it->first == lineList) && showtextlines)
248 else if ((it->first == wordList) && showwords)
254 popup.reset(
new Gtk::Menu);
255 Gtk::Menu *addto = popup.get();
256 for (std::vector<std::pair<crn::String, crn::String> >::iterator it = overlay_items_under_mouse.begin(); it != overlay_items_under_mouse.end(); ++it)
258 if ((it->first == pageList) && showpages)
260 Gtk::MenuItem *mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Page")));
263 mit->set_sensitive(
false);
266 addto = Gtk::manage(
new Gtk::Menu);
267 mit->set_submenu(*addto);
269 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Delete")));
270 mit->signal_activate().connect(sigc::bind(sigc::mem_fun(
this, &Alto::delete_page),
crn::xml::Id(it->second)));
272 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Cut vertically here")));
273 mit->signal_activate().connect(sigc::bind(sigc::mem_fun(
this, &Alto::split_page),
crn::xml::Id(it->second), x));
276 if (pagegroup.empty())
278 label =
_(
"Create group");
282 label =
_(
"Add to group");
284 label += pagegroup.size();
287 mit = Gtk::manage(
new Gtk::MenuItem(label.
CStr()));
288 mit->signal_activate().connect(sigc::bind(sigc::ptr_fun(&Alto::add_to_group), &pagegroup,
crn::xml::Id(it->second)));
290 mit->set_sensitive(
false);
292 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Merge group")));
293 mit->signal_activate().connect(sigc::mem_fun(
this, &Alto::merge_pages));
294 mit->set_sensitive(pagegroup.size() > 1);
296 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Clear group")));
297 mit->signal_activate().connect(sigc::bind(sigc::ptr_fun(&Alto::clear_group), &pagegroup));
298 mit->set_sensitive(!pagegroup.empty());
301 else if ((it->first == spaceList) && showspaces)
303 Gtk::MenuItem *mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Print space")));
306 mit->set_sensitive(
false);
309 addto = Gtk::manage(
new Gtk::Menu);
310 mit->set_submenu(*addto);
312 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Delete")));
314 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Cut vertically here")));
316 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Cut horizontally here")));
318 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Add to group")));
320 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Merge group")));
321 mit->set_sensitive(
false);
323 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Clear group")));
324 mit->set_sensitive(
false);
327 else if ((it->first == blockList) && showtextblocks)
329 Gtk::MenuItem *mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Text block")));
332 mit->set_sensitive(
false);
335 addto = Gtk::manage(
new Gtk::Menu);
336 mit->set_submenu(*addto);
338 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Delete")));
340 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Cut vertically here")));
342 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Cut horizontally here")));
344 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Add to group")));
346 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Merge group")));
347 mit->set_sensitive(
false);
349 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Clear group")));
350 mit->set_sensitive(
false);
353 else if ((it->first == lineList) && showtextlines)
355 Gtk::MenuItem *mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Text line")));
358 mit->set_sensitive(
false);
361 addto = Gtk::manage(
new Gtk::Menu);
362 mit->set_submenu(*addto);
364 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Edit")));
366 mit->signal_activate().connect(sigc::bind(sigc::mem_fun(
this, &Alto::edit_line), line.GetId()));
368 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Delete")));
370 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Cut vertically here")));
372 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Cut horizontally here")));
374 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Add to group")));
376 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Merge group")));
377 mit->set_sensitive(
false);
379 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Clear group")));
380 mit->set_sensitive(
false);
383 else if ((it->first == wordList) && showwords)
389 label += trans.
IsEmpty() ?
_(
"No transcription") : trans;
391 Gtk::MenuItem *mit = Gtk::manage(
new Gtk::MenuItem(label.CStr()));
394 mit->set_sensitive(
false);
397 addto = Gtk::manage(
new Gtk::Menu);
398 mit->set_submenu(*addto);
400 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Edit")));
401 mit->signal_activate().connect(sigc::bind(sigc::mem_fun(
this, &Alto::edit_word), word.GetId().Get()));
403 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Delete")));
405 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Cut vertically here")));
407 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Cut horizontally here")));
409 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Add to group")));
411 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Merge group")));
412 mit->set_sensitive(
false);
414 mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Clear group")));
415 mit->set_sensitive(
false);
420 addto->prepend(*Gtk::manage(
new Gtk::SeparatorMenuItem));
423 Gtk::MenuItem *mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Add word")));
424 addto->prepend(*mit);
428 Gtk::MenuItem *mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Add text line")));
429 addto->prepend(*mit);
433 Gtk::MenuItem *mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Add text block")));
434 addto->prepend(*mit);
438 Gtk::MenuItem *mit = Gtk::manage(
new Gtk::MenuItem(
_(
"Add print space")));
439 addto->prepend(*mit);
444 popup->popup(mouse_button, time);
448 void Alto::add_page()
454 alto->GetView(vid).AddPage((
int)doc.
get_document()->GetViewIndex(vid), bv->GetAbsoluteBBox().GetWidth(), bv->GetAbsoluteBBox().GetHeight(), crn::xml::Alto::Layout::Page::Position::Single);
457 catch (std::exception &ex)
468 alto->GetView(vid).RemovePage(
id);
483 crn::Rect bbox1(bv->GetAbsoluteBBox()), bbox2(bv->GetAbsoluteBBox());
502 void Alto::merge_pages()
513 AltoWordEditor ed(const_cast<crn::xml::Alto&>(*current_alto), const_cast<crn::xml::AltoWord&>(current_alto->GetWord(
id)), dynamic_cast<Gtk::Window*>(get_toplevel()));
519 AltoTextLineEditor ed(const_cast<crn::xml::Alto&>(*current_alto), const_cast<crn::xml::AltoTextLine&>(current_alto->GetTextLine(
id)), dynamic_cast<Gtk::Window*>(get_toplevel()));
528 if (overlay_id == pageList)
532 else if (overlay_id == spaceList)
536 else if (overlay_id == blockList)
540 else if (overlay_id == lineList)
544 else if (overlay_id == wordList)
void set_wrapper(const crn::xml::SAltoWrapper &w)
void set_overlay_visible(const crn::String &id, bool visible)
Shows or hides an overlay.
const crn::SDocument & get_document()
Gets the displayed document.
GtkCRN::Image & get_image()
Gets the image widget.
OverlayConfig & get_overlay_config(const crn::String &id)
Gets the configuration of an overlay.
sigc::signal< void, guint, guint32, std::vector< std::pair< crn::String, crn::String > >, int, int > signal_rmb_clicked()
Returns a signal that can be used to generate pop-up menus. Binds to void on_rmb_clicked(guint mouse_...
const char * CStr() const
Conversion to UTF8 cstring.
bool IsEmpty() const noexcept
Checks if the string is empty.
A widget to edit a text line's properties.
A UTF32 character string class.
void set_selection_type(Overlay typ)
Sets the mouse selection type.
void clear_overlay(const crn::String &id)
Clears an overlay.
const char * CStr() const noexcept
Conversion to UTF8 cstring.
crn::String get_selected_view_id()
Gets the displayed views's id.
bool IsEmpty() const noexcept
Checks if the string is empty.
void set_document(const crn::SDocument &doc)
Sets the document to display.
Alto::Layout::Page::Space::TextBlock::TextLine::Word AltoWord
void add_overlay_item(const crn::String &overlay_id, const crn::String &item_id, const crn::Rect &r, const crn::StringUTF8 &label="")
Adds a rectangle to an overlay.
sigc::signal< void, const crn::String, const std::vector< crn::String > > signal_view_selection_changed()
Signal when the selection has changed. Connect to void on_view_selection_changed(const crn::String la...
int SetRight(int endX) noexcept
Changes the rightmost coordinate.
static const crn::String & selection_overlay()
Returns the name of the mouse selection overlay.
static void show_message(const Glib::ustring &message, Gtk::MessageType mtype)
Displays a message.
MouseMode
State of the mouse activity.
A character string class.
sigc::signal< void, crn::String, crn::String, MouseMode > signal_overlay_changed()
Returns the signal associated to changes in selections. Binds to void on_overlay_changed(crn::String ...
Gdk::Color ColorFromCRNPixel(const crn::pixel::RGB8 &p)
Creates a Gdk::Color from a crn::Pixel.
bool IsNotEmpty() const noexcept
Checks if the string is not empty.
Alto::Layout::Page::Space::TextBlock::TextLine AltoTextLine
An item was not found in a container.
A widget to edit a word's properties.