From 715b3a9051ba94fce9c34242884d08166821344e Mon Sep 17 00:00:00 2001 From: eidheim Date: Fri, 27 Apr 2018 23:18:19 +0200 Subject: [PATCH] Tooltips now have css properties border-radius and padding. Also moved CSS code to window.cc --- src/directories.cc | 5 ++--- src/notebook.cc | 10 +--------- src/tooltips.cc | 33 +++++++++++++++++++++++++-------- src/tooltips.h | 1 - src/window.cc | 18 ++++++++++++++++++ 5 files changed, 46 insertions(+), 21 deletions(-) diff --git a/src/directories.cc b/src/directories.cc index 2f6a55f..0ceb032 100644 --- a/src/directories.cc +++ b/src/directories.cc @@ -116,9 +116,8 @@ Directories::Directories() : Gtk::ListViewText(1) { if(auto renderer_text=dynamic_cast(renderer)) renderer_text->property_markup()=iter->get_value(column_record.markup); }); - auto provider = Gtk::CssProvider::create(); - provider->load_from_data("*:selected {border-left-color: inherit; color: inherit; background-color: rgba(128, 128, 128 , 0.2); background-image: inherit;}"); - get_style_context()->add_provider(provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + + get_style_context()->add_class("juci_directories"); tree_store->set_sort_column(column_record.id, Gtk::SortType::SORT_ASCENDING); set_enable_search(true); //TODO: why does this not work in OS X? diff --git a/src/notebook.cc b/src/notebook.cc index 32c5e0b..07197f1 100644 --- a/src/notebook.cc +++ b/src/notebook.cc @@ -44,6 +44,7 @@ Notebook::Notebook() : Gtk::Paned(), notebooks(2) { Gsv::init(); for(auto ¬ebook: notebooks) { + notebook.get_style_context()->add_class("juci_notebook"); notebook.set_scrollable(); notebook.set_group_name("source_notebooks"); notebook.signal_switch_page().connect([this](Gtk::Widget *widget, guint) { @@ -67,15 +68,6 @@ Notebook::Notebook() : Gtk::Paned(), notebooks(2) { } } }); - - auto provider = Gtk::CssProvider::create(); - //GtkNotebook-tab-overlap got removed in gtk 3.20, but margin works in 3.20 -#if GTK_VERSION_GE(3, 20) - provider->load_from_data("tab {border-radius: 5px 5px 0 0; padding: 0 4px; margin: 0;}"); -#else - provider->load_from_data(".notebook {-GtkNotebook-tab-overlap: 0px;} tab {border-radius: 5px 5px 0 0; padding: 4px 4px;}"); -#endif - notebook.get_style_context()->add_provider(provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); } pack1(notebooks[0], true, true); } diff --git a/src/tooltips.cc b/src/tooltips.cc index 2cf7a85..18ef39e 100644 --- a/src/tooltips.cc +++ b/src/tooltips.cc @@ -50,20 +50,35 @@ void Tooltip::show(bool disregard_drawn) { window->set_accept_focus(false); window->set_skip_taskbar_hint(true); window->set_default_size(0, 0); + + window->get_style_context()->add_class("juci_tooltip_window"); + auto visual = window->get_screen()->get_rgba_visual(); + if(visual) + gtk_widget_set_visual(reinterpret_cast(window->gobj()), visual->gobj()); + + auto box=Gtk::manage(new Gtk::Box()); + box->get_style_context()->add_class("juci_tooltip_box"); + window->add(*box); - tooltip_widget=std::make_unique(create_tooltip_buffer()); - wrap_lines(tooltip_widget->get_buffer()); - tooltip_widget->set_editable(false); + auto buffer=create_tooltip_buffer(); + wrap_lines(buffer); + auto tooltip_text_view=Gtk::manage(new Gtk::TextView(buffer)); + + tooltip_text_view->set_editable(false); if(text_view) { auto tag=text_view->get_buffer()->get_tag_table()->lookup("def:note_background"); - tooltip_widget->override_background_color(tag->property_background_rgba()); + box->override_background_color(tag->property_background_rgba()); + tooltip_text_view->override_background_color(tag->property_background_rgba()); } - window->add(*tooltip_widget); + else + box->override_background_color(tooltip_text_view->get_style_context()->get_background_color()); + box->add(*tooltip_text_view); - auto layout=Pango::Layout::create(tooltip_widget->get_pango_context()); - layout->set_text(tooltip_widget->get_buffer()->get_text()); + auto layout=Pango::Layout::create(tooltip_text_view->get_pango_context()); + layout->set_text(buffer->get_text()); layout->get_pixel_size(size.first, size.second); - size.second+=2; + size.first+=6; // 2xpadding + size.second+=8; // 2xpadding + 2 window->signal_realize().connect([this] { if(!text_view) { @@ -71,6 +86,7 @@ void Tooltip::show(bool disregard_drawn) { if(dialog && dialog->is_visible()) { int root_x, root_y; dialog->get_position(root_x, root_y); + root_x-=3; // -1xpadding position.first=root_x; position.second=root_y-size.second; if(position.second<0) @@ -91,6 +107,7 @@ void Tooltip::show(bool disregard_drawn) { auto activation_rectangle_x=std::max(activation_rectangle.get_x(), visible_x); text_view->get_window(Gtk::TextWindowType::TEXT_WINDOW_TEXT)->get_root_coords(activation_rectangle_x, activation_rectangle.get_y(), root_x, root_y); + root_x-=3; // -1xpadding if(root_y text_buffer); std::function()> create_tooltip_buffer; - std::unique_ptr tooltip_widget; Gtk::TextView *text_view; std::pair size; std::pair position; diff --git a/src/window.cc b/src/window.cc index 97478a6..c8ddb7b 100644 --- a/src/window.cc +++ b/src/window.cc @@ -15,6 +15,24 @@ Window::Window() { set_title("juCi++"); set_events(Gdk::POINTER_MOTION_MASK|Gdk::FOCUS_CHANGE_MASK|Gdk::SCROLL_MASK|Gdk::LEAVE_NOTIFY_MASK); + auto provider = Gtk::CssProvider::create(); + auto screen = get_screen(); + std::string border_radius_style; + if(screen->get_rgba_visual()) + border_radius_style="border-radius: 5px; "; +#if GTK_VERSION_GE(3, 20) + std::string notebook_style(".juci_notebook tab {border-radius: 5px 5px 0 0; padding: 0 4px; margin: 0;}"); +#else + std::string notebook_style(".juci_notebook {-GtkNotebook-tab-overlap: 0px;} .juci_notebook tab {border-radius: 5px 5px 0 0; padding: 4px 4px;}"); +#endif + provider->load_from_data(R"( + .juci_directories *:selected {border-left-color: inherit; color: inherit; background-color: rgba(128, 128, 128 , 0.2); background-image: inherit;} + )"+notebook_style+R"( + .juci_tooltip_window {background-color: transparent;} + .juci_tooltip_box {)"+border_radius_style+R"(padding: 3px;} + )"); + get_style_context()->add_provider_for_screen(screen, provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + set_menu_actions(); configure(); Menu::get().toggle_menu_items();