Width calculation

This commit is contained in:
daa 2018-04-04 23:47:19 +03:00
parent 1560748f1f
commit ccd4781a9c
2 changed files with 37 additions and 31 deletions

View File

@ -2,7 +2,7 @@ use std::collections::HashMap;
use std::rc::Rc; use std::rc::Rc;
use std::sync::Arc; use std::sync::Arc;
use std::cell::RefCell; use std::cell::RefCell;
use std::cmp::max; use std::cmp::{max, min};
use gtk; use gtk;
use gtk::prelude::*; use gtk::prelude::*;
@ -268,6 +268,7 @@ pub struct CmdLine {
wild_scroll: gtk::ScrolledWindow, wild_scroll: gtk::ScrolledWindow,
wild_css_provider: gtk::CssProvider, wild_css_provider: gtk::CssProvider,
wild_renderer: gtk::CellRendererText, wild_renderer: gtk::CellRendererText,
wild_column: gtk::TreeViewColumn,
displyed: bool, displyed: bool,
state: Arc<UiMutex<State>>, state: Arc<UiMutex<State>>,
} }
@ -290,7 +291,8 @@ impl CmdLine {
drawing_area.connect_draw(clone!(state => move |_, ctx| gtk_draw(ctx, &state))); drawing_area.connect_draw(clone!(state => move |_, ctx| gtk_draw(ctx, &state)));
let (wild_scroll, wild_tree, wild_css_provider, wild_renderer) = CmdLine::create_widlmenu(); let (wild_scroll, wild_tree, wild_css_provider, wild_renderer, wild_column) =
CmdLine::create_widlmenu();
content.pack_start(&wild_scroll, false, true, 0); content.pack_start(&wild_scroll, false, true, 0);
popover.add(&content); popover.add(&content);
@ -305,6 +307,7 @@ impl CmdLine {
wild_tree, wild_tree,
wild_css_provider, wild_css_provider,
wild_renderer, wild_renderer,
wild_column,
} }
} }
@ -313,6 +316,7 @@ impl CmdLine {
gtk::TreeView, gtk::TreeView,
gtk::CssProvider, gtk::CssProvider,
gtk::CellRendererText, gtk::CellRendererText,
gtk::TreeViewColumn,
) { ) {
let css_provider = gtk::CssProvider::new(); let css_provider = gtk::CssProvider::new();
@ -327,24 +331,18 @@ impl CmdLine {
let renderer = gtk::CellRendererText::new(); let renderer = gtk::CellRendererText::new();
renderer.set_property_ellipsize(pango::EllipsizeMode::End); renderer.set_property_ellipsize(pango::EllipsizeMode::End);
let word_column = gtk::TreeViewColumn::new(); let column = gtk::TreeViewColumn::new();
word_column.pack_start(&renderer, true); column.pack_start(&renderer, true);
word_column.add_attribute(&renderer, "text", 0); column.add_attribute(&renderer, "text", 0);
tree.append_column(&word_column); tree.append_column(&column);
let scroll = gtk::ScrolledWindow::new(None, None); let scroll = gtk::ScrolledWindow::new(None, None);
scroll.set_propagate_natural_height(true); scroll.set_propagate_natural_height(true);
scroll.set_propagate_natural_width(true);
scroll.add(&tree); scroll.add(&tree);
tree.show_all(); (scroll, tree, css_provider, renderer, column)
scroll.hide();
tree.connect_size_allocate(
clone!(scroll, renderer => move |tree, _| on_wild_treeview_allocate(&scroll, tree, &renderer)),
);
(scroll, tree, css_provider, renderer)
} }
pub fn show_level(&mut self, ctx: &CmdLineContext) { pub fn show_level(&mut self, ctx: &CmdLineContext) {
@ -463,7 +461,13 @@ impl CmdLine {
.set_mode_info(mode_info); .set_mode_info(mode_info);
} }
pub fn show_wildmenu(&self, items: Vec<String>, render_state: &shell::RenderState) { pub fn show_wildmenu(
&self,
items: Vec<String>,
render_state: &shell::RenderState,
max_width: i32,
) {
// update font/color
self.wild_renderer self.wild_renderer
.set_property_font(Some(&render_state.font_ctx.font_description().to_string())); .set_property_font(Some(&render_state.font_ctx.font_description().to_string()));
@ -472,12 +476,28 @@ impl CmdLine {
popup_menu::update_css(&self.wild_css_provider, &render_state.color_model); popup_menu::update_css(&self.wild_css_provider, &render_state.color_model);
// set width
let max_item_width = (items.iter().map(|item| item.len()).max().unwrap() as f64
* render_state.font_ctx.cell_metrics().char_width) as i32
+ self.state.borrow().levels.last().unwrap().preferred_width;
self.wild_column
.set_fixed_width(min(max_item_width, max_width));
self.wild_scroll.set_max_content_width(max_width);
// load data
let list_store = gtk::ListStore::new(&vec![gtk::Type::String; 1]); let list_store = gtk::ListStore::new(&vec![gtk::Type::String; 1]);
for item in items { for item in items {
list_store.insert_with_values(None, &[0], &[&item]); list_store.insert_with_values(None, &[0], &[&item]);
} }
self.wild_tree.set_model(&list_store); self.wild_tree.set_model(&list_store);
self.wild_scroll.show();
// set height
let treeview_height =
popup_menu::calc_treeview_height(&self.wild_tree, &self.wild_renderer);
self.wild_scroll.set_max_content_height(treeview_height);
self.wild_scroll.show_all();
} }
pub fn hide_wildmenu(&self) { pub fn hide_wildmenu(&self) {
@ -539,20 +559,6 @@ fn gtk_draw(ctx: &cairo::Context, state: &Arc<UiMutex<State>>) -> Inhibit {
Inhibit(false) Inhibit(false)
} }
fn on_wild_treeview_allocate(
scroll: &gtk::ScrolledWindow,
tree: &gtk::TreeView,
renderer: &gtk::CellRendererText,
) {
let treeview_height = popup_menu::calc_treeview_height(tree, renderer);
idle_add(clone!(scroll => move || {
scroll
.set_max_content_height(treeview_height);
Continue(false)
}));
}
pub struct CmdLineContext { pub struct CmdLineContext {
pub content: Vec<(HashMap<String, Value>, String)>, pub content: Vec<(HashMap<String, Value>, String)>,
pub pos: u64, pub pos: u64,

View File

@ -1424,7 +1424,7 @@ impl State {
pub fn wildmenu_show(&self, items: Vec<String>) -> RepaintMode { pub fn wildmenu_show(&self, items: Vec<String>) -> RepaintMode {
self.cmd_line self.cmd_line
.show_wildmenu(items, &*self.render_state.borrow()); .show_wildmenu(items, &*self.render_state.borrow(), self.max_popup_width());
RepaintMode::Nothing RepaintMode::Nothing
} }