zoukankan      html  css  js  c++  java
  • wxErlang; wxAuiManager; dets

    -module(ex_aui).
    
    -behaviour(wx_object).
    
    %% Client API
    -export([start/1, new/0]).
    
    %% wx_object callbacks
    -export([init/1, terminate/2,  code_change/3,
    	 handle_info/2, handle_call/3, handle_cast/2, handle_event/2]).
    
    -define(DETS_FILENAME, "abc.conf").
    -include_lib("wx/include/wx.hrl").
    -record(state, 
    	{
    	  parent,
    	  config,
    	  aui,
          one,
          two,
          three,
          right,
          center
    	}).
    
    start(Config) ->
        wx_object:start_link(?MODULE, Config, []).
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    init(Config) ->
        wx:batch(fun() -> do_init(Config) end).
    
    -define(pi, wxAuiPaneInfo).
    
    do_init(Config) ->
        Parent = proplists:get_value(parent, Config), 
        {Width, Height} = wxFrame:getSize(Parent), 
        io:format("===>init get Frame Size ~p~n", [{Width, Height}]),
        Panel = wxPanel:new(Parent, []),
        %% Setup sizers
        MainSizer = wxBoxSizer:new(?wxVERTICAL),
    
        Manager = wxAuiManager:new([{managed_wnd, Panel}]),
    
        % RightPos  = value(right_pos, {-1, -1}),
        RightSize = value(right_size, {trunc( Width / 3), trunc(Height / 3)}),
        io:format("=====>>RightSize = ~p~n", [RightSize]),
        Pane = ?pi:new(),
        ?pi:closeButton(Pane),
        ?pi:right(Pane),
        ?pi:dockable(Pane, [{b, true}]),
        ?pi:floatingSize(Pane, 300,200),
        % ?pi:minSize(Pane, {50,50}),
        ?pi:paneBorder(Pane),
        ?pi:floatable(Pane, [{b, true}]),
        ?pi:name(Pane, "Right"),
        ?pi:bestSize(Pane, RightSize),
    
        
        Right = create_pane(11, {right_pos, {-1, -1}}, {right_size, {trunc( Width / 3), trunc(Height / 3)}}, Panel, Manager, Pane),
        OneSize = value(one_size, {300, 200}),
        io:format("OneSize = ~p~n", [OneSize]),
        One = create_pane(12, {one_pos, {-1, -1}}, {one_size, {300, 200}}, Panel, Manager,
    		?pi:gripper(?pi:bestSize(?pi:name(?pi:caption(?pi:top(?pi:new(Pane)), "One"), "One"), 
                         {trunc(Width), trunc(Height / 3)}), [{visible, false}])),
        TwoSize = value(two_size, {300, 200}),
        io:format("TwoSize = ~p~n", [TwoSize]),
        Two = create_pane(13, {two_pos, {-1, -1}}, {two_size, {300, 200}}, Panel, Manager,
    		?pi:bestSize(?pi:name(?pi:caption(?pi:left(?pi:new(Pane)), "two"), "two"),  {trunc( Width / 3), trunc(Height / 3)})),
        ThreeSize = value(three_size, {300, 200}),
        Three = create_pane(14, {three_pos, {-1, -1}}, {three_size, {300, 200}}, Panel, Manager,
    		?pi:bestSize(?pi:name(?pi:caption(?pi:bottom(?pi:new(Pane)), "Three"), "Three"),  {trunc(Width), trunc(Height / 3)})),
    
        Pane2 = wxAuiPaneInfo:new(Pane),
            ?pi:name(?pi:centrePane(Pane2), "Center"),
        % CenterSize = value(center_size, {300, 200}),
        Center = create_notebook(15, {center_pos, {-1, -1}}, {center_size, {-1, -1}}, 
                                 Panel, Manager, ?pi:new(Pane2)),
        wxPanel:setSizer(Panel, MainSizer),
        wxAuiManager:connect(Manager, aui_pane_button, [{skip,true}]),
        wxAuiManager:connect(Manager, aui_pane_maximize, [{skip,true}]),
        wxAuiManager:update(Manager),
        process_flag(trap_exit, true),
        wxFrame:connect(Parent, size,  []),
        wxFrame:show(Parent),
        {Panel, #state{parent=Panel, config=Config, 
                       one = One, two = Two, center = Center, right = Right,
                       aui=Manager, three = Three}}.
    
    value(Key, Default) ->
        dets:open_file(?DETS_FILENAME, [{type, set}]),
        GetValue =  
        case dets:lookup(?DETS_FILENAME, Key) of 
            [] ->
                Default;
            {error, Reason} ->
                io:format("get login error, Reason :~p~n", [Reason]),
                Default;
            [{_, Value}] ->
                io:format("get login name, Name :~p~n", [Value]),
                Value
        end,
        dets:close(?DETS_FILENAME),
        GetValue.
    
    store(Key, Value) ->
        dets:open_file(?DETS_FILENAME, [{type, set}]),
        dets:insert(?DETS_FILENAME, {Key, Value}),
        dets:close(?DETS_FILENAME).
    
    store(Object) ->
        dets:open_file(?DETS_FILENAME, [{type, set}]),
        dets:insert(?DETS_FILENAME, Object),
        dets:close(?DETS_FILENAME).
    
    getPosition(Tab) -> 
        PossiblePosition =
          [wxAuiPaneInfo:isLeftDockable(Tab), 
           wxAuiPaneInfo:isRightDockable(Tab),
           wxAuiPaneInfo:isTopDockable(Tab),
           wxAuiPaneInfo:isBottomDockable(Tab)],
        io:format("PossiblePosition = ~p~n", [PossiblePosition]),
        {Pos, _Seq} = 
        lists:foldl(fun(Position,  {ThePos, Seq}) ->
                      case  Position of
                          false ->
                              {ThePos, Seq + 1};
                          true ->
                              {Seq, Seq + 1}
                       end
                    end, {0, 0},  PossiblePosition),
        Pos.    
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% Callbacks handled as normal gen_server callbacks
    handle_info(Msg, State) ->
        io:format("Got Info ~p
    ", [Msg]),
        {noreply, State}.
    
    handle_call(shutdown, _From, #state{parent=Panel, aui=Manager} =  State) ->
        wxAuiManager:unInit(Manager),
        wxAuiManager:destroy(Manager),
        wxPanel:destroy(Panel),
        {stop, normal, ok, State};
    
    handle_call(Msg, _From, State) ->
        io:format("Got Call ~p
    ", [Msg]),
        {reply,{error, nyi}, State}.
    
    handle_cast(Msg, State) ->
        io:format("Got cast ~p~n",[Msg]),
        {noreply,State}.
    
    %% Async Events are handled in handle_event as in handle_info
    handle_event(#wx{obj = Notebook,
    		 event = #wxCommand{type = command_button_clicked}},
    	     #state{parent = Parent, aui = Manager, 
                    one = One, two = Two, center = Center, right = Right,
                    three = Three} = State) ->
        % (1)
        % Tab = wxPanel:new(Notebook, []),
        % wxButton:new(Tab, ?wxID_ANY, [{label,"New tab"}]),
        % wxAuiNotebook:insertPage(Notebook, 1, Tab, "OMG TAB!! ", [{select, false}]),
        % (2)
        % io:format("Parent Size = ~p~n", [wxWindow:getSize(Parent)]),
        % io:format("Three Size = ~p~n", [wxWindow:getSize(Three)]),
        % io:format("Two Size = ~p~n", [wxWindow:getSize(Two)]),
        % io:format("One Size = ~p~n", [wxWindow:getSize(One)]),
        % io:format("Right Size = ~p~n", [wxWindow:getSize(Right)]),
        % io:format("Center Size = ~p~n", [wxWindow:getSize(Center)]),
        % io:format("---------------------------~n"),
        % io:format("Parent Pos = ~p~n", [wxWindow:getPosition(Parent)]),
        % io:format("Three Pos = ~p~n", [wxWindow:getPosition(Three)]),
        % io:format("Two Pos = ~p~n", [wxWindow:getPosition(Two)]),
        % io:format("One Pos = ~p~n", [wxWindow:getPosition(One)]),
        % io:format("Right Pos = ~p~n", [wxWindow:getPosition(Right)]),
        % io:format("Center Pos = ~p~n", [wxWindow:getPosition(Center)]),
        % io:format("---------------------------~n"),
        % (2.2) Its wrong//
        % Pos1 = getPosition(wxAuiManager:getPane(Manager, "One")),
        % Pos2 = getPosition(wxAuiManager:getPane(Manager, "Two")),   
        % Pos3 = getPosition(wxAuiManager:getPane(Manager, "Center")), 
        % Pos4 = getPosition(wxAuiManager:getPane(Manager, "Right")),
        % Pos5 = getPosition(wxAuiManager:getPane(Manager, "Three")),
        % io:format("Positions =One:~p, Two = ~p, Center = ~p, Right = ~p, Three = ~p~n", 
        %      [Pos1, Pos2, Pos3, Pos4, Pos5]),
        % (3)wxAuiPaneInfoArray
        % What = wxAuiManager:getAllPanes(Manager),
        % io:format("What = ~p~n", [What]),
        % (4)
        O = get_input({wxTextCtrl, 12}) ,
        io:format("R = ~p~n", [O]),
        io:format("One = ~p~n", [One]),
        io:format("tests : ~p~n", [wxWindow:getPosition(One)]),
        Pos1 = wxWindow:getPosition(One),
        io:format("Pos1 = ~p~n", [Pos1]),
        Pos2 = wxWindow:getPosition(Two),  
        Pos3 = wxWindow:getPosition(Three), 
        Pos4 = wxWindow:getPosition(Right),
        Pos5 = wxWindow:getPosition(Center),
    
        Size1 = wxWindow:getSize(One),
        Size2 = wxWindow:getSize(Two),   
        Size3 = wxWindow:getSize(Three), 
        Size4 = wxWindow:getSize(Right),
        Size5 = wxWindow:getSize(Center),
        % Pos5 = wxWindow:getPosition(wxWindow:findWindowById(14, [])),
        % Size1 = wxWindow:getSize(wxWindow:findWindowById(12, [])),
        {Width, Height} = wxFrame:getSize(Parent), 
        store([{one_pos, Pos1}, {two_pos, Pos2}, {three_pos, Pos5}, 
               {right_pos, Pos4}, {center_pos, Pos3},
               {one_size, {trunc(Width), trunc(Height / 3)}}, 
               {two_size, {trunc( Width / 3), trunc(Height / 3)}}, 
               {three_size, {trunc(Width), trunc(Height / 3)}}, 
               {right_size, Size4}, {center_size, Size3}]) ,
        {noreply, State};
    
    handle_event(#wx{event = #wxSize{type = size, size ={_W, _H}}}, State) ->
        #state{parent=Panel, config=Config} = State,
        Parent = proplists:get_value(parent, Config), 
        {Width, Height} = wxWindow:getVirtualSize(Panel),
        {ParentWidth, ParentHeight} = wxWindow:getVirtualSize(Parent),
        io:format("Panel size = ~p, frame size = ~p~n", 
                  [{Width, Height}, {ParentWidth, ParentHeight}]),
        {noreply, State};
    
    handle_event(#wx{obj = Notebook,
    		 event = #wxAuiNotebook{type = command_auinotebook_page_changed,
    					selection = Sel}}, State) ->
        io:format("You have changed page to ~p.
    ",
    		[wxAuiNotebook:getPageText(Notebook, Sel)]),
        {noreply, State};
    handle_event(#wx{event = #wxAuiNotebook{type = command_auinotebook_page_close}}, State) ->
        io:format("You have closed a page.
    ",[]),
        {noreply, State};
    handle_event(#wx{event = #wxAuiManager{type = aui_pane_button,
    				       button = Button}}, State) ->
        case Button of
    	?wxAUI_BUTTON_CLOSE ->
    	    io:format("You have closed a pane.
    ",[]);
    	?wxAUI_BUTTON_MAXIMIZE_RESTORE ->
    	    ok;
    	?wxAUI_BUTTON_PIN ->
    	    io:format("You have pinned a pane.
    ",[])
        end,
        {noreply, State};
    handle_event(#wx{event = #wxAuiManager{type = aui_pane_maximize}}, State) ->
        io:format("You have maximized a pane.
    ",[]),
        {noreply, State};
    handle_event(#wx{event = #wxAuiManager{type = aui_pane_restore}}, State) ->
        io:format("You have restored a pane.
    ",[]),
        {noreply, State};
    handle_event(Ev = #wx{}, State) ->
        io:format("~p
    ", [Ev]),
        {noreply, State}.
    
    code_change(_, _, State) ->
        {stop, ignore, State}.
    
    terminate(_Reason, #state{parent = Panel, 
                              one = One, two = Two, center = Center, right = Right,
                              three = Three} = State) ->
        % O = get_input({wxTextCtrl, 12}) ,
        % io:format("R = ~p~n", [O]),
        % io:format("One = ~p~n", [One]),
        % io:format("Parent Pos = ~p~n", [wxWindow:getPosition(Panel)]),
        % io:format("tests : ~p~n", [wxWindow:getPosition(One)]),
        % Pos1 = wxWindow:getPosition(One),
        % io:format("Pos1 = ~p~n", [Pos1]),
        % Pos2 = wxWindow:getPosition(Two),  
        % Pos3 = wxWindow:getPosition(Three), 
        % Pos4 = wxWindow:getPosition(Right),
        % Pos5 = wxWindow:getPosition(Center),
    
        % Size1 = wxWindow:getSize(One),
        % Size2 = wxWindow:getSize(Two),   
        % Size3 = wxWindow:getSize(Three), 
        % Size4 = wxWindow:getSize(Right),
        % Size5 = wxWindow:getSize(Center),
     
        % % Pos5 = wxWindow:getPosition(wxWindow:findWindowById(14, [])),
        % % Size1 = wxWindow:getSize(wxWindow:findWindowById(12, [])),
        % store([{one_pos, Pos1}, {two_pos, Pos2}, {three_pos, Pos5}, 
        %        {right_pos, Pos4}, {center_pos, Pos3},
        %        {one_size, Size1}, {two_size, Size2}, {three_size, Size5}, 
        %        {right_size, Size4}, {center_size, Size3}]) ,
        ok.
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% Local functions
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    create_notebook(ID, {Pos, DefaultPos}, {Size, DefaultSize}, Parent, Manager, Pane) ->
        Style = (0
    	     bor ?wxAUI_NB_DEFAULT_STYLE
    	     bor ?wxAUI_NB_TOP
    	     bor ?wxAUI_NB_WINDOWLIST_BUTTON
    	     bor ?wxAUI_NB_CLOSE_ON_ACTIVE_TAB
    	     bor ?wxAUI_NB_TAB_MOVE
    	     bor ?wxAUI_NB_SCROLL_BUTTONS
    	    ),
        WindowPos  = value(Pos, DefaultPos),
        WindowSize = value(Size, DefaultSize),
        Notebook = wxAuiNotebook:new(Parent, [{id, ID},
            {style, Style}, {size,  WindowSize}, {pos, WindowPos}]),
        Tab1 = wxPanel:new(Notebook, []),
        wxPanel:setBackgroundColour(Tab1, ?wxBLACK),
        wxButton:new(Tab1, ?wxID_ANY, [{label,"New tab"}]),
        wxAuiNotebook:addPage(Notebook, Tab1, "You can", []),
    
        Tab2 = wxPanel:new(Notebook, []),
        wxPanel:setBackgroundColour(Tab2, ?wxRED),
        wxButton:new(Tab2, ?wxID_ANY, [{label,"New tab"}]),
        wxAuiNotebook:addPage(Notebook, Tab2, "rearrange", []),
    
        Tab3 = wxPanel:new(Notebook, []),
        wxPanel:setBackgroundColour(Tab3, ?wxGREEN),
        wxButton:new(Tab3, ?wxID_ANY, [{label,"New tab"}]),
        wxAuiNotebook:addPage(Notebook, Tab3, "these tabs", []),
    
        wxAuiManager:addPane(Manager, Notebook, Pane),
    
        wxAuiNotebook:connect(Notebook, command_button_clicked),
        wxAuiNotebook:connect(Notebook, command_auinotebook_page_close, [{skip, false}]),
        wxAuiNotebook:connect(Notebook, command_auinotebook_page_changed),
        Notebook.
    
    
    create_pane(ID, {Pos, DefaultPos}, {Size, DefaultSize}, Parent, Manager, Pane) ->
        WindowPos  = value(Pos, DefaultPos),
        WindowSize = value(Size, DefaultSize),
        TextCtrl = wxTextCtrl:new(Parent, ID, 
                             [{size,  WindowSize}, 
                              {pos, WindowPos},
    						  {value, "An empty pane"},
    						  {style, 0
    						   bor ?wxDEFAULT
    						   bor ?wxTE_MULTILINE}]),
        wxAuiManager:addPane(Manager, TextCtrl, Pane),
        TextCtrl.
    
    new() ->
        _WX = wx:new(),
        Size = {size, {1400, 800}},
        Pos = {pos, {0, 0}},
        Style = {style, ?wxDEFAULT_FRAME_STYLE bor ?wxMAXIMIZE},
        NOptions = [Pos, Size, Style],
        Frame = makeFrame("aui Test", NOptions),
        start([{parent, Frame}]).
    
    makeFrame(Title, Options) ->
        Frame = wxFrame:new(wx:null(), ?wxID_ANY, Title, Options),
        MenuSet  = wxMenu:new(),
        MenuHelp = wxMenu:new(),
        wxMenu:append(MenuHelp, 1, "About..."),
        MenuBar = wxMenuBar:new(),
        wxMenuBar:append(MenuBar, MenuSet, "Setting"),
        wxMenuBar:append(MenuBar, MenuHelp, "Help"),
        wxFrame:setMenuBar(Frame, MenuBar),
        wxFrame:createStatusBar(Frame),
        wxFrame:setStatusText(Frame,"deal wxTextCtrl"),
        wxFrame:connect(Frame, command_menu_selected),
        Frame.   
     
    
    get_input({Type, WxId}) ->
        Wx = wxWindow:findWindowById(WxId, []),
        case Type of
            wxTextCtrl ->
                wx:typeCast(Wx, wxTextCtrl);
            wxComboBox ->
                wx:typeCast(Wx, wxComboBox);
            wxCheckBox ->
                wx:typeCast(Wx, wxCheckBox);
            wxAuiNotebook ->
                wx:typeCast(Wx, wxAuiNotebook);
            _ ->
                lager:error("Type ~p is not supported"),
                undefined
        end.
    
    
  • 相关阅读:
    git常用命令
    国内优秀npm镜像,nvm
    canvas --> getImageData()
    canvas sprite动画 简单封装
    springboot项目中ttf和woff字体图标页面无法显示
    树莓派配置Oracle JDK8
    记一次SqlServer大表查询语句优化和执行计划分析
    linux 查看某个进程和服务内存占用情况命令
    安装MySQL后,需要调整的10个性能配置项
    ARM架构上的Debian10编译timescaledb
  • 原文地址:https://www.cnblogs.com/ShankYan/p/4365132.html
Copyright © 2011-2022 走看看