Skip to content

Instantly share code, notes, and snippets.

@anaselli
Last active January 2, 2017 12:57
Show Gist options
  • Save anaselli/1024bb6a94fa038df0b418aeb627ddc9 to your computer and use it in GitHub Desktop.
Save anaselli/1024bb6a94fa038df0b418aeb627ddc9 to your computer and use it in GitHub Desktop.
/*
* Copyright (c) 2014 Angelo Naselli <[email protected]>
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
* SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
// Click on link into RichText (ncurses problem)
//
// Compile with:
//
// g++ -I/usr/include/yui -lyui Test-YTree-ncurses.cc -o Test
#include <yui/YUI.h>
#include <yui/YApplication.h>
#include <yui/YWidgetFactory.h>
#include <yui/YDialog.h>
#include <yui/YLayoutBox.h>
#include <yui/YAlignment.h>
#include <yui/YTree.h>
#include <yui/YPushButton.h>
#include <yui/YEvent.h>
int main( int argc, char **argv )
{
YDialog * dialog = YUI::widgetFactory()->createMainDialog();
YLayoutBox * vbox = YUI::widgetFactory()->createVBox( dialog );
YTree* tree = YUI::widgetFactory()->createTree( vbox, "Select:" );
tree->setNotify( true );
YPushButton* quitButton = YUI::widgetFactory()->createPushButton( vbox, "&OK" );
dialog->pollEvent();
{
YItemCollection items;
YTreeItem *t = new YTreeItem( "Item 1" );
new YTreeItem( t, "Item 1-2" );
items.push_back( t );
t = new YTreeItem( "Item 2" );
new YTreeItem(t, "Item 2-1" );
items.push_back(t);
tree->startMultipleChanges();
tree->deleteAllItems();
tree->addItems( items ); // This is more efficient than repeatedly calling tree->addItem
tree->doneMultipleChanges();
}
while ( true )
{
YEvent * event = dialog->waitForEvent();
if ( event )
{
// window manager "close window" button
if ( event->eventType() == YEvent::CancelEvent || event->widget() == quitButton )
break; // leave event loop
else if (event->widget() == tree)
{
YItem *it = tree->selectedItem();
std::cout << it->label() << std::endl;
}
}
}
dialog->destroy();
}
@mvidner
Copy link

mvidner commented Jan 2, 2017

  1. It segfaults if dialog->pollEvent() is omitted
  2. Items are shown twice (1 2 1 2, not 1 1 2 2)
    This seems to be triggered by startMultipleChanges + doneMultipleChanges; the deleteAllItems has no influence.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment