mirror of https://github.com/bsnes-emu/bsnes.git
142 lines
4.4 KiB
C++
Executable File
142 lines
4.4 KiB
C++
Executable File
#if defined(Hiro_TreeView)
|
|
|
|
namespace hiro {
|
|
|
|
auto pTreeViewItem::construct() -> void {
|
|
if(auto parentWidget = _parentWidget()) {
|
|
if(auto parentItem = _parentItem()) {
|
|
gtk_tree_store_append(parentWidget->gtkTreeStore, >kIter, &parentItem->gtkIter);
|
|
} else {
|
|
gtk_tree_store_append(parentWidget->gtkTreeStore, >kIter, nullptr);
|
|
}
|
|
setChecked(state().checked);
|
|
setIcon(state().icon);
|
|
setText(state().text);
|
|
}
|
|
}
|
|
|
|
auto pTreeViewItem::destruct() -> void {
|
|
if(auto parent = _parentWidget()) {
|
|
gtk_tree_store_remove(parent->gtkTreeStore, >kIter);
|
|
}
|
|
}
|
|
|
|
//
|
|
|
|
auto pTreeViewItem::append(sTreeViewItem item) -> void {
|
|
}
|
|
|
|
auto pTreeViewItem::remove(sTreeViewItem item) -> void {
|
|
}
|
|
|
|
auto pTreeViewItem::setBackgroundColor(Color color) -> void {
|
|
}
|
|
|
|
auto pTreeViewItem::setCheckable(bool checkable) -> void {
|
|
_updateWidth();
|
|
}
|
|
|
|
auto pTreeViewItem::setChecked(bool checked) -> void {
|
|
if(auto parentWidget = _parentWidget()) {
|
|
gtk_tree_store_set(parentWidget->gtkTreeStore, >kIter, 0, checked, -1);
|
|
}
|
|
}
|
|
|
|
auto pTreeViewItem::setExpanded(bool expanded) -> void {
|
|
if(auto parentWidget = _parentWidget()) {
|
|
auto path = gtk_tree_model_get_path(parentWidget->gtkTreeModel, >kIter);
|
|
if(expanded) {
|
|
gtk_tree_view_expand_row(parentWidget->gtkTreeView, path, false);
|
|
//if you collapse a parent node, GTK collapses all child nodes
|
|
//this isn't very desirable, so restore any child expansions recursively here
|
|
for(auto& item : state().items) {
|
|
item->setExpanded(item->expanded());
|
|
}
|
|
} else {
|
|
gtk_tree_view_collapse_row(parentWidget->gtkTreeView, path);
|
|
}
|
|
gtk_tree_path_free(path);
|
|
}
|
|
}
|
|
|
|
auto pTreeViewItem::setFocused() -> void {
|
|
if(auto parentWidget = _parentWidget()) {
|
|
GtkTreePath* path = gtk_tree_path_new_from_string(self().path().transform("/", ":"));
|
|
gtk_tree_view_set_cursor(parentWidget->gtkTreeView, path, nullptr, false);
|
|
gtk_tree_view_scroll_to_cell(parentWidget->gtkTreeView, path, nullptr, true, 0.5, 0.0);
|
|
gtk_tree_path_free(path);
|
|
}
|
|
}
|
|
|
|
auto pTreeViewItem::setForegroundColor(Color color) -> void {
|
|
}
|
|
|
|
auto pTreeViewItem::setIcon(const image& icon) -> void {
|
|
if(auto parentWidget = _parentWidget()) {
|
|
if(icon) {
|
|
auto pixbuf = CreatePixbuf(icon);
|
|
gtk_tree_store_set(parentWidget->gtkTreeStore, >kIter, 1, pixbuf, -1);
|
|
} else {
|
|
gtk_tree_store_set(parentWidget->gtkTreeStore, >kIter, 1, nullptr, -1);
|
|
}
|
|
}
|
|
_updateWidth();
|
|
}
|
|
|
|
auto pTreeViewItem::setSelected() -> void {
|
|
if(auto parentWidget = _parentWidget()) {
|
|
parentWidget->lock();
|
|
//in order to select an item, it must first be visible
|
|
auto gtkPath = gtk_tree_model_get_path(parentWidget->gtkTreeModel, >kIter);
|
|
gtk_tree_view_expand_to_path(parentWidget->gtkTreeView, gtkPath);
|
|
gtk_tree_path_free(gtkPath);
|
|
gtk_tree_selection_select_iter(parentWidget->gtkTreeSelection, >kIter);
|
|
parentWidget->unlock();
|
|
}
|
|
}
|
|
|
|
auto pTreeViewItem::setText(const string& text) -> void {
|
|
if(auto parentWidget = _parentWidget()) {
|
|
gtk_tree_store_set(parentWidget->gtkTreeStore, >kIter, 2, (const char*)text, -1);
|
|
}
|
|
_updateWidth();
|
|
}
|
|
|
|
//
|
|
|
|
//recursive function to find the minimum (pre-computed / cached) width of a TreeViewItem tree
|
|
auto pTreeViewItem::_minimumWidth(uint depth) -> uint {
|
|
uint width = TreeViewIndentation * depth + _width;
|
|
for(auto& item : state().items) {
|
|
if(auto self = item->self()) {
|
|
width = max(width, self->_minimumWidth(depth + 1));
|
|
}
|
|
}
|
|
return width;
|
|
}
|
|
|
|
auto pTreeViewItem::_parentItem() -> pTreeViewItem* {
|
|
if(auto parentItem = self().parentTreeViewItem()) return parentItem->self();
|
|
return nullptr;
|
|
}
|
|
|
|
auto pTreeViewItem::_parentWidget() -> pTreeView* {
|
|
if(auto parentWidget = self().parentTreeView(true)) return parentWidget->self();
|
|
return nullptr;
|
|
}
|
|
|
|
//this is called any time a TreeViewItem's checkability, icon, or text is updated
|
|
//in other words, whenever the width of the item might have changed
|
|
//it may change the requirement of the TreeView needing a scrollbar, so notify the TreeView as well
|
|
auto pTreeViewItem::_updateWidth() -> void {
|
|
_width = 4;
|
|
if(state().checkable) _width += 16 + (state().icon || state().text ? 4 : 0);
|
|
if(auto& icon = state().icon) _width += icon.width() + 2;
|
|
if(auto& text = state().text) _width += pFont::size(self().font(true), text).width();
|
|
if(auto parent = _parentWidget()) parent->_updateScrollBars();
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|