96: m_Box(
Gtk::Orientation::VERTICAL),
97 m_ToolBar(
Gtk::Orientation::HORIZONTAL, 4)
99 set_title(
"canvas widget");
150 for (std::size_t
p = 0;
p < fmts.size();
p += 3) {
151 std::string ext = fmts[
p+1];
153 if ((ext !=
"C") && (ext != fmts[
p + 2]))
163 m_action_group->add_action(
"new", []() { std::cout <<
"New canvas Clicked!\n"; });
169 for (std::size_t
p = 0;
p < fmts.size();
p += 3) {
170 std::string ext = fmts[
p+1];
171 std::string opt = fmts[
p+2];
173 if ((ext !=
"C") && (ext != opt))
194 auto toggle_toolbar = Gio::SimpleAction::create_bool(
"show-toolbar", isShowToolbar);
198 auto toggle_statusbar = Gio::SimpleAction::create_bool(
"show-eventstatus", isShowEventStatus);
202 auto toggle_tooltip = Gio::SimpleAction::create_bool(
"show-tooltip", isShowToolTips);
211 auto menu_model = Gio::Menu::create();
216 auto sec1 = Gio::Menu::create();
217 sec1->append(
"New Canvas",
"canvas.new");
218 sec1->append(
"Open",
"canvas.open");
219 sec1->append(
"Close Canvas",
"canvas.close");
221 auto sec2 = Gio::Menu::create();
226 sec2->append(
"Save as...",
"canvas.saveas");
228 auto sec3 = Gio::Menu::create();
229 sec3->append(
"Quit ROOT",
"canvas.quit");
231 auto file_menu = Gio::Menu::create();
232 file_menu->append_section(sec1);
233 file_menu->append_section(sec2);
234 file_menu->append_section(sec3);
237 menu_model->append_submenu(
"File", file_menu);
241 auto edit_menu = Gio::Menu::create();
242 edit_menu->append(
"Clear pad",
"canvas.clearpad");
243 edit_menu->append(
"Clear canvas",
"canvas.clearcanvas");
246 auto special_paste_submenu = Gio::Menu::create();
247 special_paste_submenu->append(
"Paste Text Only",
"canvas.paste");
248 special_paste_submenu->append(
"Paste with Formatting",
"canvas.paste");
251 edit_menu->append_submenu(
"Paste Special...", special_paste_submenu);
254 menu_model->append_submenu(
"Edit", edit_menu);
258 auto view_menu = Gio::Menu::create();
259 view_menu->append(
"Editor",
"canvas.show-editor");
260 view_menu->append(
"Toolbar",
"canvas.show-toolbar");
261 view_menu->append(
"Event Status",
"canvas.show-eventstatus");
262 view_menu->append(
"Tooltip",
"canvas.show-tooltip");
264 menu_model->append_submenu(
"View", view_menu);
268 auto menu_bar = Gtk::make_managed<Gtk::PopoverMenuBar>(menu_model);
270 menu_bar->set_visible(isShowMenuBar);
272 menu_bar->signal_state_flags_changed().connect([
this](Gtk::StateFlags) {
276 m_Box.append(*menu_bar);
283 Glib::RefPtr<Gdk::Texture> texture;
287 auto original_pixbuf = Gdk::Pixbuf::create_from_file(
filename);
290 auto scaled_pixbuf = original_pixbuf->scale_simple(16, 16, Gdk::InterpType::BILINEAR);
293 texture = Gdk::Texture::create_for_pixbuf(scaled_pixbuf);
295 }
catch (
const Glib::FileError&
e) {
296 std::cerr <<
"File system error: " <<
e.what() << std::endl;
298 }
catch (
const Gdk::PixbufError&
e) {
299 std::cerr <<
"Failed to parse XPM image format: " <<
e.what() << std::endl;
304 auto image = Gtk::make_managed<Gtk::Image>(texture);
313 auto css_provider = Gtk::CssProvider::create();
316 css_provider->load_from_data(
"button { padding: 2px 2px; min-width: 0; min-height: 0; }");
320 if (strlen(btn->fPixmap) == 0) {
322 auto separator = Gtk::make_managed<Gtk::Separator>(Gtk::Orientation::VERTICAL);
327 auto button = Gtk::make_managed<Gtk::Button>();
331 iconname.
Append(btn->fPixmap);
337 button->set_child(*image);
339 button->get_style_context()->add_provider(css_provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
341 button->set_tooltip_text(btn->fTipText);
343 button->signal_clicked().connect([
this, btn]() {
371 canv->Modified(
kTRUE);
413 bool is_checked = Glib::VariantBase::cast_dynamic<Glib::Variant<bool>>(
value).get();
420 auto simple_action = std::dynamic_pointer_cast<Gio::SimpleAction>(action);
421 simple_action->set_state(
value);
427 bool is_checked = Glib::VariantBase::cast_dynamic<Glib::Variant<bool>>(
value).get();
434 auto simple_action = std::dynamic_pointer_cast<Gio::SimpleAction>(action);
435 simple_action->set_state(
value);
441 bool is_checked = Glib::VariantBase::cast_dynamic<Glib::Variant<bool>>(
value).get();
448 auto simple_action = std::dynamic_pointer_cast<Gio::SimpleAction>(action);
449 simple_action->set_state(
value);
461 auto filter_root_files = Gtk::FileFilter::create();
462 filter_root_files->set_name(
"ROOT files (*.root)");
463 filter_root_files->add_pattern(
"*.root");
465 auto filter_xml_files = Gtk::FileFilter::create();
466 filter_xml_files->set_name(
"ROOT XML files (*.xml)");
467 filter_xml_files->add_pattern(
"*.xml");
469 auto filter_all_files = Gtk::FileFilter::create();
470 filter_all_files->set_name(
"All files (*.*)");
471 filter_all_files->add_pattern(
"*.*");
473 auto filters_list = Gio::ListStore<Gtk::FileFilter>::create();
474 filters_list->append(filter_root_files);
475 filters_list->append(filter_xml_files);
476 filters_list->append(filter_all_files);
498 }
catch (
const Gtk::DialogError &err) {
510 static std::vector<std::string> lst = {
511 "Post Script",
"ps",
"ps",
512 "Post Script Portrait",
"ps",
"Portrait",
513 "Post Script Landscape",
"ps",
"Landscape",
514 "Encapsulated Post Script",
"eps",
"eps",
515 "Encapsulated Post Script preview",
"eps",
"Preview",
516 "GIF format",
"gif",
"gif",
517 "PDF format",
"pdf",
"pdf",
518 "SVG format",
"svg",
"svg",
519 "XPM format",
"xpm",
"xpm",
520 "PNG format",
"png",
"png",
521 "JPG format",
"jpg",
"jpg",
522 "BMP format",
"bmp",
"bmp",
523 "TIFF format",
"tiff",
"tiff",
524 "C++ Macro",
"C",
"cxx",
525 "json file",
"json",
"json",
526 "html file",
"html",
"html",
527 "root file",
"root",
"root"
542 canv->Print(fname.c_str(), opt.c_str());
556 auto filters_list = Gio::ListStore<Gtk::FileFilter>::create();
560 for (std::size_t
p = 0;
p < fmts.size();
p += 3) {
561 std::string ext = fmts[
p + 1];
563 if ((ext !=
"C") && (ext != fmts[
p + 2]))
568 auto filter = Gtk::FileFilter::create();
569 filter->set_name(
name.Data());
570 filter->add_pattern(pattern.Data());
571 filters_list->append(filter);
573 if (fmts[
p+1] ==
"png")
582 std::string
name = canv->GetName();
601 std::string raw_path = file->get_path();
602 std::filesystem::path sys_path(raw_path);
603 std::string extension = sys_path.extension().string();
604 std::string print_opt;
608 for (std::size_t
p = 0;
p < fmts.size();
p += 3) {
609 if (extension ==
"." + fmts[
p + 1]) {
610 print_opt = fmts[
p + 2];
615 if (print_opt.empty())
616 ::Error(
"Gtk4CanvasWindow::on_save_selected",
"Cannot detect file format from selected extension %s", extension.c_str());
618 printf(
"Store canvas %s as %s opt %s\n", canv->ClassName(), raw_path.c_str(), print_opt.c_str());
619 canv->Print(raw_path.c_str(), print_opt.c_str());
622 }
catch (
const Gtk::DialogError &err) {
Gtk::Image * create_resized_xpm_image(const char *filename)
static ToolBarData_t toolBarData[]
R__EXTERN TApplication * gApplication
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t height
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t button
void on_show_tooltip_changed(const Glib::VariantBase &)
Glib::RefPtr< Gtk::FileDialog > m_file_dialog
void on_show_eventstatus_changed(const Glib::VariantBase &)
Glib::RefPtr< Gio::SimpleActionGroup > m_action_group
void on_status_changed(const char *msg)
const std::vector< std::string > & GetSupportedFileFormats() const
Return vector with supported file formats with description and print option To be moved in base class...
void on_saveCanvas(const std::string &fname, const std::string &opt)
Save canvas with specified format.
void on_save_selected(const Glib::RefPtr< Gio::AsyncResult > &result)
Signal handler when save as dialog select file.
std::string fCanvasFileName
void fillSaveMenu(TCanvas *canv)
Fill or update canvas save menu Only performed when canvas name is changed.
void on_file_selected(const Glib::RefPtr< Gio::AsyncResult > &result)
Signal handler when open file dialog select file.
void on_show_toolbar_changed(const Glib::VariantBase &)
Gtk::Statusbar m_StatusBar
Glib::RefPtr< Gio::Menu > fSaveMenu
void clickToolButton(int id)
Gtk4CanvasWindow(TCanvas *canv=nullptr, unsigned width=400, unsigned height=200)
void fillMenuBar(TCanvas *canv)
void on_saveCanvasAs()
Start Save as dialog.
Glib::RefPtr< Gtk::FileDialog > m_save_dialog
virtual ~Gtk4CanvasWindow()
sigc::signal< void(const char *) status_changed)()
TCanvas * GetCanvas() const
static TCanvas * MakeDefCanvas()
Static function to build a default canvas.
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
const char * GetName() const override
Returns name of object.
static const TString & GetIconPath()
Get the icon path in the installation. Static utility function.
const char * Data() const
TString & Append(const char *cs)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
static void SingleShot(Int_t milliSec, const char *receiver_class, void *receiver, const char *method)
This static function calls a slot after a given time interval.