[erlang-questions] Reading data from wxListCtrl

Joakim Hirsch joakim@REDACTED
Tue Sep 30 11:29:20 CEST 2014


Hi,

I'm having some trouble using wxListCtrl. I've created a table and 
filled it with data. When a row is activated (2-click) I receive an 
index into the table: the row number. I want to read (some of) the data 
from that row, but I can't figure out how.

To me it appears as if wxListCtrl:getItem/1 doesn't read the data into 
the Item. Below is a minimal example. Where do I go wrong?

Regs,
Joakim

-module(test_gui).

-behaviour(wx_object).

%% Client API
-export([start/0]).

%% wx_object callbacks
-export([init/1, terminate/2,  code_change/3,
      handle_info/2, handle_call/3, handle_cast/2, handle_event/2,
      handle_sync_event/3]).

-include_lib("wx/include/wx.hrl").

-record(state,
     {
       parent
     }).


start() ->
     Wx = wx:new(),
     Size = {size, {500, 500}},
     Frame = wxFrame:new(Wx, ?wxID_ANY, "Title", [Size]),
     Config = [{parent, Frame}],
     wx_object:start_link(?MODULE, Config, []).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
init(Config) ->
     wx:batch(fun() -> do_init(Config) end).

do_init(Config) ->
     Parent = proplists:get_value(parent, Config),

     % Create panel and set up sizer.
     Panel = wxPanel:new(Parent, []),
     MainSizer = wxBoxSizer:new(?wxVERTICAL),
     wxPanel:setSizer(Panel, MainSizer),

     LC = wxListCtrl:new(Panel, [{style, ?wxLC_REPORT bor 
?wxLC_SINGLE_SEL}]),
     wxSizer:add(MainSizer, LC, [{flag, ?wxEXPAND}]),

     % Create columns
     wxListCtrl:insertColumn(LC, 0, "name", []),
     wxListCtrl:insertColumn(LC, 1, "address", []),

     % Create the row
     wxListCtrl:insertItem(LC, 0, ""),

     % Write cell 0,0
     wxListCtrl:setItem(LC, 0, 0, "Bob"),

     % Write cell 0,1
     Item1 = wxListItem:new(),
     wxListItem:setId(Item1, 0),
     wxListItem:setColumn(Item1, 1),
     wxListItem:setText(Item1, "Street"),
     true = wxListCtrl:setItem(LC, Item1),

     wxFrame:show(Parent),

     % Read 0,0
     It0 = wxListItem:new(),
     wxListItem:setId(It0, 0),
     wxListItem:setColumn(It0, 0),
     true = wxListCtrl:getItem(LC, It0),

     io:format("Row 0: ~p~n", [wxListItem:getId(It0)]),
     io:format("Col 0: ~p~n", [wxListItem:getColumn(It0)]),
     io:format("getText: ~p~n", [wxListItem:getText(It0)]),

     % Read 0,1
     It1 = wxListItem:new(),
     wxListItem:setId(It1, 0),
     wxListItem:setColumn(It1, 1),
     true = wxListCtrl:getItem(LC, It1),

     io:format("Row 0: ~p~n", [wxListItem:getId(It1)]),
     io:format("Col 1: ~p~n", [wxListItem:getColumn(It1)]),
     io:format("getText: ~p~n", [wxListItem:getText(It1)]),

     wxWindow:connect(LC, command_list_item_activated),

     {Parent, #state{parent = Parent}}.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Sync events i.e. from callbacks must return ok, it can not return a
%% new state.  Do the redrawing here.
handle_sync_event(#wx{event = #wxPaint{}},_,
           #state{}) ->
     ok.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Callbacks handled as normal gen_server callbacks
%%

handle_event(#wx{obj = LC,
          event = #wxList{type = command_list_item_activated, itemIndex 
= Index}},
          State) ->

     It0 = wxListItem:new(),
     wxListItem:setId(It0, Index),
     wxListItem:setColumn(It0, 0),
     true = wxListCtrl:getItem(LC, It0),

     io:format("Row 0: ~p~n", [wxListItem:getId(It0)]),
     io:format("Col 0: ~p~n", [wxListItem:getColumn(It0)]),
     io:format("getText: ~p~n", [wxListItem:getText(It0)]),

     It1 = wxListItem:new(),
     wxListItem:setId(It1, Index),
     wxListItem:setColumn(It1, 1),
     true = wxListCtrl:getItem(LC, It1),

     io:format("Row 0: ~p~n", [wxListItem:getId(It1)]),
     io:format("Col 1: ~p~n", [wxListItem:getColumn(It1)]),
     io:format("getText: ~p~n", [wxListItem:getText(It1)]),

     {noreply, State};

%% Unknown event.
%%
handle_event(Ev = #wx{}, State) ->
     io:format("Got event:~p\n", [Ev]),
     {noreply, State}.

handle_info(Msg, State) ->
     io:format("Got Info ~p\n", [Msg]),
     {noreply, State}.

handle_call(shutdown, _From, State=#state{parent=Parent}) ->
     io:format("Shutdown~n", []),
     wxPanel:destroy(Parent),
     {stop, normal, ok, State};

handle_call(Msg, _From, State) ->
     io:format("Got Call ~p\n", [Msg]),
     {reply, {error, unknown_call}, State}.

handle_cast(Msg, State) ->
     io:format("Got cast ~p~n",[Msg]),
     {noreply, State}.

code_change(_, _, State) ->
     {stop, ignore, State}.

terminate(_Reason, _State) ->
     io:format("Stopping~n", []),
     wx:destroy(),
     ok.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20140930/14fd517c/attachment.htm>


More information about the erlang-questions mailing list