libcrn  3.9.5
A document image processing library
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GtkCRNAltoDisplay.cpp
Go to the documentation of this file.
1 /* Copyright 2011-2016 CoReNum, INSA-Lyon
2  *
3  * This file is part of libgtkcrnmm.
4  *
5  * libgtkcrnmm is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * libgtkcrnmm is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with libgtkcrnmm. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * file: GdkCRNAltoDisplay.cpp
19  * \author Yann LEYDIER
20  */
21 
22 #include <GtkCRNAltoDisplay.h>
23 #include <CRNImage/CRNPixel.h>
24 #include <GdkCRNPixbuf.h>
25 #include <GtkCRNApp.h>
26 #include <GtkCRNAltoWordEditor.h>
28 #include <CRNi18n.h>
29 
30 #ifndef CRN_USING_GTKMM3
31 using namespace GtkCRN;
32 
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");
38 
40  actions(Gtk::ActionGroup::create("alto display")),
41  alto(nullptr),
42  doc(true, false),
43  edit_mode(false)
44 {
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);
52  show_hide_pages();
53  show_hide_spaces();
54  show_hide_blocks();
55  show_hide_lines();
56  show_hide_words();
57 
58  // pages in blue
59  crn::pixel::RGB8 pcol1(0, 0, 255);
60  crn::pixel::RGB8 pcol2(0, 0, 127);
64  doc.get_image().get_overlay_config(pageList).fill = false;
65  doc.get_image().get_overlay_config(pageList).show_labels = false;
66  // spaces in cyan
67  crn::pixel::RGB8 scol1(0, 255, 255);
68  crn::pixel::RGB8 scol2(0, 127, 127);
72  doc.get_image().get_overlay_config(spaceList).fill = false;
73  doc.get_image().get_overlay_config(spaceList).show_labels = false;
74  // blocks in red
75  crn::pixel::RGB8 bcol1(255, 0, 0);
76  crn::pixel::RGB8 bcol2(127, 0, 0);
80  doc.get_image().get_overlay_config(blockList).fill = false;
81  doc.get_image().get_overlay_config(blockList).show_labels = false;
82  // lines in yellow
83  crn::pixel::RGB8 lcol1(255, 255, 0);
84  crn::pixel::RGB8 lcol2(127, 127, 0);
88  doc.get_image().get_overlay_config(lineList).fill = false;
89  doc.get_image().get_overlay_config(lineList).show_labels = false;
90  // words in green
91  crn::pixel::RGB8 wcol1(0, 255, 0);
92  crn::pixel::RGB8 wcol2(0, 127, 0);
96  doc.get_image().get_overlay_config(wordList).fill = false;
97  doc.get_image().get_overlay_config(wordList).show_labels = true;
98 
99  doc.signal_view_selection_changed().connect(sigc::hide(sigc::hide(sigc::mem_fun(this, &Alto::on_view_changed))));
100  doc.get_image().signal_rmb_clicked().connect(sigc::mem_fun(this, &Alto::on_rmb_clicked));
101  doc.get_image().signal_overlay_changed().connect(sigc::mem_fun(this, &Alto::on_overlay_changed));
102 
103  pack_start(doc, true, true, 0);
104  doc.show();
105 }
106 
107 void Alto::set_wrapper(const crn::xml::SAltoWrapper &w)
108 {
109  alto = w;
110  if (alto)
111  doc.set_document(alto->GetDocument());
112  else
113  doc.set_document(nullptr);
114  update_boxes();
115 }
116 
117 void Alto::on_view_changed()
118 {
119  pagegroup.clear();
120  spacegroup.clear();
121  textblockgroup.clear();
122  textlinegroup.clear();
123  wordgroup.clear();
124  update_boxes();
125 }
126 
127 void Alto::update_boxes()
128 {
129  doc.get_image().clear_overlay(pageList);
130  doc.get_image().clear_overlay(spaceList);
131  doc.get_image().clear_overlay(blockList);
132  doc.get_image().clear_overlay(lineList);
133  doc.get_image().clear_overlay(wordList);
134  current_alto = nullptr;
135  if (doc.get_document() && doc.get_selected_view_id().IsNotEmpty())
136  {
137  try
138  {
139  current_alto = alto->GetView(doc.get_selected_view_id()).GetAlto();
140  }
141  catch (...)
142  { }
144  if (vid.IsNotEmpty())
145  {
146  crn::xml::AltoWrapper::View aview(alto->GetView(vid));
147  const std::vector<crn::xml::Id> pages(aview.GetPages());
148  for (const crn::xml::Id &pid : pages)
149  { // add pages
150  crn::xml::AltoWrapper::Page apage(aview.GetPage(pid));
151  doc.get_image().add_overlay_item(pageList, apage.GetId(), apage.GetBBox());
152  const std::vector<crn::xml::Id> spaces(apage.GetSpaces());
153  for (const crn::xml::Id &sid : spaces)
154  { // add spaces
155  crn::xml::AltoWrapper::Space aspace(apage.GetSpace(sid));
156  doc.get_image().add_overlay_item(spaceList, aspace.GetId(), aspace.GetBBox());
157  const std::vector<crn::xml::Id> blocks(aspace.GetTextBlocks());
158  for (const crn::xml::Id &bid : blocks)
159  { // add text blocks
160  crn::xml::AltoWrapper::TextBlock ablock(aspace.GetTextBlock(bid));
161  doc.get_image().add_overlay_item(blockList, ablock.GetId(), ablock.GetBBox());
162  const std::vector<crn::xml::Id> lines(ablock.GetTextLines());
163  for (const crn::xml::Id &lid : lines)
164  { // add lines
165  crn::xml::AltoWrapper::TextLine aline(ablock.GetTextLine(lid));
166  doc.get_image().add_overlay_item(lineList, aline.GetId(), aline.GetBBox());
167  const std::vector<crn::xml::Id> words(aline.GetWords());
168  for (const crn::xml::Id &wid : words)
169  { // add words
170  crn::xml::AltoWrapper::Word aword(aline.GetWord(wid));
171  doc.get_image().add_overlay_item(wordList, aword.GetId(), aword.GetBBox(), aword.GetContent());
172  } // add words
173  } // add lines
174  } // add text blocks
175  } // add spaces
176  } // add pages
177  } // a view is selected
178  } // a document is loaded
179 }
180 
181 void Alto::show_hide_pages()
182 {
183  showpages = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(actions->get_action("alto-pages"))->get_active();
184  doc.get_image().set_overlay_visible(pageList, showpages);
185 }
186 
187 void Alto::show_hide_spaces()
188 {
189  showspaces = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(actions->get_action("alto-spaces"))->get_active();
190  doc.get_image().set_overlay_visible(spaceList, showspaces);
191 }
192 
193 void Alto::show_hide_blocks()
194 {
195  showtextblocks = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(actions->get_action("alto-textblocks"))->get_active();
196  doc.get_image().set_overlay_visible(blockList, showtextblocks);
197 }
198 
199 void Alto::show_hide_lines()
200 {
201  showtextlines = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(actions->get_action("alto-textlines"))->get_active();
202  doc.get_image().set_overlay_visible(lineList, showtextlines);
203 }
204 
205 void Alto::show_hide_words()
206 {
207  showwords = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(actions->get_action("alto-words"))->get_active();
208  doc.get_image().set_overlay_visible(wordList, showwords);
209 }
210 
211 void Alto::toggle_edit()
212 {
213  edit_mode = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(actions->get_action("alto-edit"))->get_active();
215  //doc.get_image().get_overlay_config(pageList).editable = edit_mode;
216  //doc.get_image().get_overlay_config(spaceList).editable = edit_mode;
217  //doc.get_image().get_overlay_config(blockList).editable = edit_mode;
218  //doc.get_image().get_overlay_config(lineList).editable = edit_mode;
219  doc.get_image().get_overlay_config(wordList).editable = edit_mode;
220 }
221 
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)
223 {
224  if (edit_mode && current_alto->GetLayout().GetPages().empty())
225  {
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));
229  popup->append(*mit);
230  popup->show_all();
231  popup->popup(mouse_button, time);
232  return;
233  }
234  if (edit_mode && !overlay_items_under_mouse.empty())
235  {
236  // count number of submenus to display
237  int nmenus = 0;
238  for (std::vector<std::pair<crn::String, crn::String> >::iterator it = overlay_items_under_mouse.begin(); it != overlay_items_under_mouse.end(); ++it)
239  {
240  if ((it->first == pageList) && showpages)
241  nmenus += 1;
242  else if ((it->first == spaceList) && showspaces)
243  nmenus += 1;
244  else if ((it->first == blockList) && showtextblocks)
245  nmenus += 1;
246  else if ((it->first == lineList) && showtextlines)
247  nmenus += 1;
248  else if ((it->first == wordList) && showwords)
249  nmenus += 1;
250  }
251  if (nmenus == 0)
252  return;
253  // create new menu
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)
257  { // for each zone under the mouse
258  if ((it->first == pageList) && showpages)
259  { // page
260  Gtk::MenuItem *mit = Gtk::manage(new Gtk::MenuItem(_("Page")));
261  popup->append(*mit);
262  if (nmenus == 1)
263  mit->set_sensitive(false);
264  else
265  {
266  addto = Gtk::manage(new Gtk::Menu);
267  mit->set_submenu(*addto);
268  }
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)));
271  addto->append(*mit);
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));
274  addto->append(*mit);
275  crn::StringUTF8 label;
276  if (pagegroup.empty())
277  {
278  label = _("Create group");
279  }
280  else
281  {
282  label = _("Add to group");
283  label += " (";
284  label += pagegroup.size();
285  label += ")";
286  }
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)));
289  if (pagegroup.count(crn::xml::Id(it->second)))
290  mit->set_sensitive(false);
291  addto->append(*mit);
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);
295  addto->append(*mit);
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());
299  addto->append(*mit);
300  }
301  else if ((it->first == spaceList) && showspaces)
302  { // print space
303  Gtk::MenuItem *mit = Gtk::manage(new Gtk::MenuItem(_("Print space")));
304  popup->append(*mit);
305  if (nmenus == 1)
306  mit->set_sensitive(false);
307  else
308  {
309  addto = Gtk::manage(new Gtk::Menu);
310  mit->set_submenu(*addto);
311  }
312  mit = Gtk::manage(new Gtk::MenuItem(_("Delete")));
313  addto->append(*mit);
314  mit = Gtk::manage(new Gtk::MenuItem(_("Cut vertically here")));
315  addto->append(*mit);
316  mit = Gtk::manage(new Gtk::MenuItem(_("Cut horizontally here")));
317  addto->append(*mit);
318  mit = Gtk::manage(new Gtk::MenuItem(_("Add to group")));
319  addto->append(*mit);
320  mit = Gtk::manage(new Gtk::MenuItem(_("Merge group")));
321  mit->set_sensitive(false); // TODO
322  addto->append(*mit);
323  mit = Gtk::manage(new Gtk::MenuItem(_("Clear group")));
324  mit->set_sensitive(false); // TODO
325  addto->append(*mit);
326  }
327  else if ((it->first == blockList) && showtextblocks)
328  { // text block
329  Gtk::MenuItem *mit = Gtk::manage(new Gtk::MenuItem(_("Text block")));
330  popup->append(*mit);
331  if (nmenus == 1)
332  mit->set_sensitive(false);
333  else
334  {
335  addto = Gtk::manage(new Gtk::Menu);
336  mit->set_submenu(*addto);
337  }
338  mit = Gtk::manage(new Gtk::MenuItem(_("Delete")));
339  addto->append(*mit);
340  mit = Gtk::manage(new Gtk::MenuItem(_("Cut vertically here")));
341  addto->append(*mit);
342  mit = Gtk::manage(new Gtk::MenuItem(_("Cut horizontally here")));
343  addto->append(*mit);
344  mit = Gtk::manage(new Gtk::MenuItem(_("Add to group")));
345  addto->append(*mit);
346  mit = Gtk::manage(new Gtk::MenuItem(_("Merge group")));
347  mit->set_sensitive(false); // TODO
348  addto->append(*mit);
349  mit = Gtk::manage(new Gtk::MenuItem(_("Clear group")));
350  mit->set_sensitive(false); // TODO
351  addto->append(*mit);
352  }
353  else if ((it->first == lineList) && showtextlines)
354  { // text line
355  Gtk::MenuItem *mit = Gtk::manage(new Gtk::MenuItem(_("Text line")));
356  popup->append(*mit);
357  if (nmenus == 1)
358  mit->set_sensitive(false);
359  else
360  {
361  addto = Gtk::manage(new Gtk::Menu);
362  mit->set_submenu(*addto);
363  }
364  mit = Gtk::manage(new Gtk::MenuItem(_("Edit")));
365  const crn::xml::AltoTextLine &line(current_alto->GetTextLine(it->second.CStr()));
366  mit->signal_activate().connect(sigc::bind(sigc::mem_fun(this, &Alto::edit_line), line.GetId()));
367  addto->append(*mit);
368  mit = Gtk::manage(new Gtk::MenuItem(_("Delete")));
369  addto->append(*mit);
370  mit = Gtk::manage(new Gtk::MenuItem(_("Cut vertically here")));
371  addto->append(*mit);
372  mit = Gtk::manage(new Gtk::MenuItem(_("Cut horizontally here")));
373  addto->append(*mit);
374  mit = Gtk::manage(new Gtk::MenuItem(_("Add to group")));
375  addto->append(*mit);
376  mit = Gtk::manage(new Gtk::MenuItem(_("Merge group")));
377  mit->set_sensitive(false); // TODO
378  addto->append(*mit);
379  mit = Gtk::manage(new Gtk::MenuItem(_("Clear group")));
380  mit->set_sensitive(false); // TODO
381  addto->append(*mit);
382  }
383  else if ((it->first == wordList) && showwords)
384  { // word/string
385  crn::StringUTF8 label(_("Word"));
386  label += " (";
387  const crn::xml::AltoWord &word(current_alto->GetWord(it->second.CStr()));
388  crn::StringUTF8 trans(word.GetContent());
389  label += trans.IsEmpty() ? _("No transcription") : trans;
390  label += ")";
391  Gtk::MenuItem *mit = Gtk::manage(new Gtk::MenuItem(label.CStr()));
392  popup->append(*mit);
393  if (nmenus == 1)
394  mit->set_sensitive(false);
395  else
396  {
397  addto = Gtk::manage(new Gtk::Menu);
398  mit->set_submenu(*addto);
399  }
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()));
402  addto->append(*mit);
403  mit = Gtk::manage(new Gtk::MenuItem(_("Delete")));
404  addto->append(*mit);
405  mit = Gtk::manage(new Gtk::MenuItem(_("Cut vertically here")));
406  addto->append(*mit);
407  mit = Gtk::manage(new Gtk::MenuItem(_("Cut horizontally here")));
408  addto->append(*mit);
409  mit = Gtk::manage(new Gtk::MenuItem(_("Add to group")));
410  addto->append(*mit);
411  mit = Gtk::manage(new Gtk::MenuItem(_("Merge group")));
412  mit->set_sensitive(false); // TODO
413  addto->append(*mit);
414  mit = Gtk::manage(new Gtk::MenuItem(_("Clear group")));
415  mit->set_sensitive(false); // TODO
416  addto->append(*mit);
417  }
418  else if (it->first == GtkCRN::Image::selection_overlay())
419  {
420  addto->prepend(*Gtk::manage(new Gtk::SeparatorMenuItem));
421  if (showwords)
422  {
423  Gtk::MenuItem *mit = Gtk::manage(new Gtk::MenuItem(_("Add word")));
424  addto->prepend(*mit);
425  }
426  if (showtextlines)
427  {
428  Gtk::MenuItem *mit = Gtk::manage(new Gtk::MenuItem(_("Add text line")));
429  addto->prepend(*mit);
430  }
431  if (showtextblocks)
432  {
433  Gtk::MenuItem *mit = Gtk::manage(new Gtk::MenuItem(_("Add text block")));
434  addto->prepend(*mit);
435  }
436  if (showspaces)
437  {
438  Gtk::MenuItem *mit = Gtk::manage(new Gtk::MenuItem(_("Add print space")));
439  addto->prepend(*mit);
440  }
441  }
442  }
443  popup->show_all();
444  popup->popup(mouse_button, time);
445  }
446 }
447 
448 void Alto::add_page()
449 {
450  try
451  {
453  crn::SBlock bv(doc.get_document()->GetView(vid));
454  alto->GetView(vid).AddPage((int)doc.get_document()->GetViewIndex(vid), bv->GetAbsoluteBBox().GetWidth(), bv->GetAbsoluteBBox().GetHeight(), crn::xml::Alto::Layout::Page::Position::Single);
455  update_boxes();
456  }
457  catch (std::exception &ex)
458  {
459  GtkCRN::App::show_message(_("Cannot add page."), Gtk::MESSAGE_ERROR);
460  }
461 }
462 
463 void Alto::delete_page(const crn::xml::Id &id)
464 {
465  try
466  {
468  alto->GetView(vid).RemovePage(id);
469  update_boxes();
470  }
471  catch (...)
472  {
473  GtkCRN::App::show_message(_("Cannot remove page."), Gtk::MESSAGE_ERROR);
474  }
475 }
476 
477 void Alto::split_page(const crn::xml::Id &id, int x)
478 {
479  throw crn::ExceptionTODO();
480  // créer deux nouvelles pages
482  crn::SBlock bv(doc.get_document()->GetView(vid));
483  crn::Rect bbox1(bv->GetAbsoluteBBox()), bbox2(bv->GetAbsoluteBBox());
484  bbox1.SetRight(x - 1);
485  bbox2.SetLeft(x);
486  crn::xml::AltoWrapper::Page p1(alto->GetView(vid).AddPage((int)doc.get_document()->GetViewIndex(vid), bbox1.GetWidth(), bbox1.GetHeight(), crn::xml::Alto::Layout::Page::Position::Left));
487  crn::xml::AltoWrapper::Page p2(alto->GetView(vid).AddPage((int)doc.get_document()->GetViewIndex(vid), bbox2.GetWidth(), bbox2.GetHeight(), crn::xml::Alto::Layout::Page::Position::Right));
488  // déplacer le contenu de la page dans les deux nouvelles
489  // TODO
490  throw crn::ExceptionTODO();
491  crn::xml::AltoWrapper::Page oldp(alto->GetView(vid).GetPage(id)); // should not throw
492  try
493  {
494  crn::xml::AltoWrapper::Space sp(oldp.GetTopMargin());
495  // TODO
496  }
497  catch (crn::ExceptionNotFound&) { } // no top margin
498  // supprimer la vieille page
499  update_boxes();
500 }
501 
502 void Alto::merge_pages()
503 {
504  throw crn::ExceptionTODO();
505  // TODO fusionner les print spaces un à un
506  // TODO fusionner les styles des pages et des print spaces
507  // TODO mettre à jour la position de la page
508  // TODO effacer la seconde
509 }
510 
511 void Alto::edit_word(const crn::xml::Id &id)
512 {
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()));
514  ed.run();
515 }
516 
517 void Alto::edit_line(const crn::xml::Id &id)
518 {
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()));
520  ed.run();
521 }
522 
523 void Alto::on_overlay_changed(crn::String overlay_id, crn::String overlay_item_id, GtkCRN::Image::MouseMode mm)
524 {
525  if (overlay_item_id.IsEmpty())
526  return;
527 
528  if (overlay_id == pageList)
529  {
530  // TODO too shitty
531  }
532  else if (overlay_id == spaceList)
533  {
534  // TODO too shitty
535  }
536  else if (overlay_id == blockList)
537  {
538  // TODO too shitty
539  }
540  else if (overlay_id == lineList)
541  {
542  // TODO too shitty
543  }
544  else if (overlay_id == wordList)
545  {
546  try
547  {
548  crn::xml::AltoWord &word = const_cast<crn::xml::AltoWord&>(current_alto->GetWord(overlay_item_id.CStr()));
549  }
550  catch (...)
551  { }
552  }
553 }
554 
555 #endif
556 
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.
Definition: GtkCRNImage.h:232
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_...
Definition: GtkCRNImage.h:120
#define _(String)
Definition: CRNi18n.h:51
const char * CStr() const
Conversion to UTF8 cstring.
Definition: CRNString.cpp:167
bool IsEmpty() const noexcept
Checks if the string is empty.
Definition: CRNString.h:166
A widget to edit a text line's properties.
A UTF32 character string class.
Definition: CRNString.h:61
void set_selection_type(Overlay typ)
Sets the mouse selection type.
#define false
Definition: ConvertUTF.cpp:56
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.
#define true
Definition: ConvertUTF.cpp:57
Alto::Layout::Page::Space::TextBlock::TextLine::Word AltoWord
Definition: CRNAlto.h:157
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.
Definition: CRNRect.h:166
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.
Definition: GtkCRNApp.cpp:149
MouseMode
State of the mouse activity.
Definition: GtkCRNImage.h:116
A character string class.
Definition: CRNStringUTF8.h:49
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 ...
Definition: GtkCRNImage.h:118
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.
Definition: CRNString.h:168
Alto::Layout::Page::Space::TextBlock::TextLine AltoTextLine
Definition: CRNAlto.h:153
Something to be done.
Definition: CRNException.h:167
An item was not found in a container.
Definition: CRNException.h:95
A widget to edit a word's properties.
A rectangle class.
Definition: CRNRect.h:46