/wxCustomControls

A generic control for wxWidgets (currently: wxTreeCtrl and wxDataViewListCtrl)

Primary LanguageC++MIT LicenseMIT

clTreeCtrl

This control has a consistent look and feel across all platforms. It uses the exact wxTreeCtrl API with slight modifications. The goal is to be able to use it as a drop-in replacement in your code for wxTreeCtrl. In addition to the traditional tree view, clTreeCtrl allows you to display columns (similar to wxTreeListCtrl)

Advantages over the standrd wx controls out there:

  • Performance & Optimization: you can display thousands (and more, many more) entries, and the performance is close to instant
  • Customisation: you can colour any part of the control (text, selected item text, font, selected text, selected text background, hover bg colour, expand/collapse button; and unlike other controls, you can do this per cell.
  • scrollbar on demand: the scrollbar to can be set to hide when the control loses the focus
  • Sorting: one of the headaches using wxTreeCtrl is sorting items. clTreeCtrl uses modern C++ API to support this.

For example, lets assume you have a tree representing the file system. You want folders to be displayed first, sorted A-Z, followed by files (which should also be sorted A-Z)

Also, let's assume that you keep client data per node, holding the node type, so your code should look something like this:

clTreeCtrl* tree = new clTreeCtrl(this);
/// The function returns true if A should placed BEFORE B
std::function<bool(const wxTreeItemId&, const wxTreeItemId&)> SortFunc = [&](const wxTreeItemId& itemA,
                                                                             const wxTreeItemId& itemB) {
    clTreeCtrlData* a = dynamic_cast<clTreeCtrlData*>(GetItemData(itemA));
    clTreeCtrlData* b = dynamic_cast<clTreeCtrlData*>(GetItemData(itemB));
    if(a->IsFolder() && b->IsFile())
        return true;
    else if(b->IsFolder() && a->IsFile())
        return false;
    // same kind
    return (a->GetName().CmpNoCase(b->GetName()) < 0);
};
tree->SetSortFunction(SortFunc );

Table view:

Continuing with the above example, assuming you want a table with 3 columns: path, type and size, the code should look similar to this:

    clHeaderBar header;
    header.Add("Path");
    header.Add("Kind");
    header.Add("Size");
    m_tree->SetHeader(header);

Adding row (with 3 columns):

// Add the item (this will fill column 0 content)
wxTreeItemId folderItem = m_tree->AppendItem(item, filename, 0, 1, new MyItemData(fn.GetFullPath(), true));
// Add data in columns 1 and 2
m_tree->SetItemText(folderItem, "Folder", 1);
m_tree->SetItemText(folderItem, "0KB", 2);

As a bonus, no more wxImageList! - clTreeCtrl uses std::vector<wxBitmap> for storing the bitmaps.

The code is licensed under the MIT license, see the LICENSE file for more details

alt text

alt text