From: John L. <jr...@us...> - 2006-05-04 05:07:10
|
Update of /cvsroot/wxlua/wxLua/samples In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19877/wxLua/samples Modified Files: wxluasudoku.wx.lua Log Message: fix static wxClipboard::Get in clipdrag.i cleanup in interal.cpp add more pages to prefs dialog in wxluasudoku Index: wxluasudoku.wx.lua =================================================================== RCS file: /cvsroot/wxlua/wxLua/samples/wxluasudoku.wx.lua,v retrieving revision 1.41 retrieving revision 1.42 diff -C2 -d -r1.41 -r1.42 *** wxluasudoku.wx.lua 2 May 2006 05:25:06 -0000 1.41 --- wxluasudoku.wx.lua 4 May 2006 05:07:04 -0000 1.42 *************** *** 23,26 **** --- 23,27 ---- function iff(cond, A, B) if cond then return A else return B end end + -- make the number or bool into a bool or number function makebool(n) if n == 0 then return false else return true end end function makeint(n) if n == false then return 0 else return 1 end end *************** *** 43,47 **** end - -- Set a value in the table or subtable, first making sure that the subtables -- are created first. --- 44,47 ---- *************** *** 99,103 **** -- ============================================================================ ! -- Make a deep copy of a table, including all sub tables function TableCopy(atable) local newtable = {} --- 99,103 ---- -- ============================================================================ ! -- Make a deep copy of a table, including all sub tables, fails on recursive tables function TableCopy(atable) local newtable = {} *************** *** 114,117 **** --- 114,118 ---- -- Merge the two tables together, adding or replacing values in original_table -- with those in new_table, returns a new table and doesn't modify inputs + -- fails on recursive tables function TableMerge(new_table, original_table) local out_table = TableCopy(original_table) *************** *** 143,147 **** sudoku.FILENAME = 7 -- store the filename from Open/Save functions ! sudoku.FLAG_MAX = 7 -- given the upper left cell of block you can iterate through the block using --- 144,149 ---- sudoku.FILENAME = 7 -- store the filename from Open/Save functions ! sudoku.ELIMINATE_FLAG_MIN = 1 -- for iterating the ELIMINATE flags ! sudoku.ELIMINATE_FLAG_MAX = 6 -- given the upper left cell of block you can iterate through the block using *************** *** 760,766 **** function sudoku.FindAllNakedHiddenGroups(find_all, sudokuTable) local flags = TableCopy(sudokuTable.flags) ! if find_all then -- turn all ELIMINATE_XXX on ! for n = 1, sudoku.FLAG_MAX do sudokuTable.flags[n] = true end --- 762,768 ---- function sudoku.FindAllNakedHiddenGroups(find_all, sudokuTable) local flags = TableCopy(sudokuTable.flags) ! if find_all == true then -- turn all ELIMINATE_XXX on ! for n = sudoku.ELIMINATE_FLAG_MIN, sudoku.ELIMINATE_FLAG_MAX do sudokuTable.flags[n] = true end *************** *** 771,775 **** local char0 = string.byte("0") ! if find_all then sudokuTable.flags = TableCopy(flags) -- put the flags back to how they were end --- 773,777 ---- local char0 = string.byte("0") ! if find_all == true then sudokuTable.flags = TableCopy(flags) -- put the flags back to how they were end *************** *** 891,901 **** -- values for the row to exclude these values function sudoku.RemovePossibleGroups(sudokuTable) ! if (sudokuTable.flags[sudoku.ELIMINATE_NAKED_PAIRS] ~= true) and ! (sudokuTable.flags[sudoku.ELIMINATE_HIDDEN_PAIRS] ~= true) and ! (sudokuTable.flags[sudoku.ELIMINATE_NAKED_TRIPLETS] ~= true) and ! (sudokuTable.flags[sudoku.ELIMINATE_HIDDEN_TRIPLETS] ~= true) and ! (sudokuTable.flags[sudoku.ELIMINATE_NAKED_QUADS] ~= true) and ! (sudokuTable.flags[sudoku.ELIMINATE_HIDDEN_QUADS] ~= true) then ! return sudokuTable end --- 893,906 ---- -- values for the row to exclude these values function sudoku.RemovePossibleGroups(sudokuTable) ! -- must have at least one flag set ! local has_elim_flags = false ! for n = sudoku.ELIMINATE_FLAG_MIN, sudoku.ELIMINATE_FLAG_MAX do ! if sudokuTable.flags[n] == true then ! has_elim_flags = true ! break ! end ! end ! if has_elim_flags == false then ! return sudokuTable end *************** *** 1688,1691 **** --- 1693,1697 ---- fontTable.width = 0 if not font_cache then font_cache = {} end + local increment = 4 while (fontTable.size < 1000) and ((fontTable.height < height) and (fontTable.width < width)) do *************** *** 1703,1707 **** end ! fontTable.size = fontTable.size + 1 end --- 1709,1722 ---- end ! if ((fontTable.height > height) or (fontTable.width > width)) then ! if increment > 1 then ! fontTable.height = 0 ! fontTable.width = 0 ! fontTable.size = fontTable.size - increment - 1 -- get next smaller size ! increment = 1 ! end ! end ! ! fontTable.size = fontTable.size + increment end *************** *** 2676,2685 **** -- "cheat" a little by using SolveScan to get easy to find values ! s.flags[sudoku.ELIMINATE_NAKED_PAIRS] = true ! s.flags[sudoku.ELIMINATE_HIDDEN_PAIRS] = true ! s.flags[sudoku.ELIMINATE_NAKED_TRIPLETS] = true ! s.flags[sudoku.ELIMINATE_HIDDEN_TRIPLETS] = true ! s.flags[sudoku.ELIMINATE_NAKED_QUADS] = true ! s.flags[sudoku.ELIMINATE_HIDDEN_QUADS] = true local s, count, changed_cells = sudoku.SolveScan(s) --- 2691,2697 ---- -- "cheat" a little by using SolveScan to get easy to find values ! for n = sudoku.ELIMINATE_FLAG_MIN, sudoku.ELIMINATE_FLAG_MAX do ! s.flags[n] = true ! end local s, count, changed_cells = sudoku.SolveScan(s) *************** *** 2731,2758 **** local sudokuTable = sudokuGUI.GetCurrentGrid() ! sudokuTable.flags[sudoku.ELIMINATE_NAKED_PAIRS] = ! sudokuGUI.menuCheckIDs[sudokuGUI.ID_ELIMINATE_NAKEDPAIRS] ! sudokuTable.flags[sudoku.ELIMINATE_HIDDEN_PAIRS] = ! sudokuGUI.menuCheckIDs[sudokuGUI.ID_ELIMINATE_HIDDENPAIRS] ! sudokuTable.flags[sudoku.ELIMINATE_NAKED_TRIPLETS] = ! sudokuGUI.menuCheckIDs[sudokuGUI.ID_ELIMINATE_NAKEDTRIPLETS] ! sudokuTable.flags[sudoku.ELIMINATE_HIDDEN_TRIPLETS] = ! sudokuGUI.menuCheckIDs[sudokuGUI.ID_ELIMINATE_HIDDENTRIPLETS] ! sudokuTable.flags[sudoku.ELIMINATE_NAKED_QUADS] = ! sudokuGUI.menuCheckIDs[sudokuGUI.ID_ELIMINATE_NAKEDQUADS] ! sudokuTable.flags[sudoku.ELIMINATE_HIDDEN_QUADS] = ! sudokuGUI.menuCheckIDs[sudokuGUI.ID_ELIMINATE_HIDDENQUADS] sudokuGUI.block_refresh = true sudokuTable = sudoku.UpdateTable(sudokuTable) ! if sudokuGUI.menuCheckIDs[sudokuGUI.ID_SHOW_NAKED] or ! sudokuGUI.menuCheckIDs[sudokuGUI.ID_SHOW_HIDDEN] or ! sudokuGUI.menuCheckIDs[sudokuGUI.ID_SHOW_NAKEDPAIRS] or ! sudokuGUI.menuCheckIDs[sudokuGUI.ID_SHOW_HIDDENPAIRS] or ! sudokuGUI.menuCheckIDs[sudokuGUI.ID_SHOW_NAKEDTRIPLETS] or ! sudokuGUI.menuCheckIDs[sudokuGUI.ID_SHOW_HIDDENTRIPLETS] or ! sudokuGUI.menuCheckIDs[sudokuGUI.ID_SHOW_NAKEDQUADS] or ! sudokuGUI.menuCheckIDs[sudokuGUI.ID_SHOW_HIDDENQUADS] then sudokuTable.nakedTable, sudokuTable.hiddenTable = sudoku.FindAllNakedHiddenGroups(true, sudokuTable) end --- 2743,2759 ---- local sudokuTable = sudokuGUI.GetCurrentGrid() ! local has_show_flag = false ! for n = sudoku.ELIMINATE_FLAG_MIN, sudoku.ELIMINATE_FLAG_MAX do ! local id = sudokuGUI.ID_ELIMINATE_NAKEDPAIRS + n - sudoku.ELIMINATE_FLAG_MIN ! sudokuTable.flags[n] = sudokuGUI.menuCheckIDs[id] ! ! local show_id = sudokuGUI.ID_SHOW_NAKEDPAIRS + n - sudoku.ELIMINATE_FLAG_MIN ! if sudokuGUI.menuCheckIDs[show_id] == true then has_show_flag = true end ! end sudokuGUI.block_refresh = true sudokuTable = sudoku.UpdateTable(sudokuTable) ! if has_show_flag == true then sudokuTable.nakedTable, sudokuTable.hiddenTable = sudoku.FindAllNakedHiddenGroups(true, sudokuTable) end *************** *** 2779,2786 **** end ! function sudokuGUI.PreferencesDialog() ! local dialog = wx.wxDialog(sudokuGUI.frame, wx.wxID_ANY, ! "wxLuaSudoku - Preferences") ! local panel = wx.wxPanel(dialog, wx.wxID_ANY) local ID_LISTBOX = 10 --- 2780,2787 ---- end ! sudokuGUI.PreferencesDialogPageUI = {} ! ! function sudokuGUI.PreferencesDialogPageUI.Create(parent) ! local panel = wx.wxPanel(parent, wx.wxID_ANY) local ID_LISTBOX = 10 *************** *** 2843,2856 **** -- Create the dialog ------------------------------------------------------ - local parent = panel local mainSizer = wx.wxBoxSizer( wx.wxVERTICAL ) - local fcStaticBox = wx.wxStaticBox( parent, wx.wxID_ANY, "Fonts and colors" ) - local fcStaticSizer = wx.wxStaticBoxSizer( fcStaticBox, wx.wxVERTICAL ) - local fcFlexSizer = wx.wxFlexGridSizer( 1, 2, 0, 0 ) fcFlexSizer:AddGrowableCol( 0 ) ! local fcListBox = wx.wxListBox( parent, ID_LISTBOX, wx.wxDefaultPosition, wx.wxSize(80,100), listStrings, wx.wxLB_SINGLE ) fcListBox:SetSelection(0) fcFlexSizer:AddWindow( fcListBox, 0, wx.wxGROW+wx.wxALIGN_CENTER_HORIZONTAL+wx.wxALL, 5 ) --- 2844,2854 ---- -- Create the dialog ------------------------------------------------------ local mainSizer = wx.wxBoxSizer( wx.wxVERTICAL ) local fcFlexSizer = wx.wxFlexGridSizer( 1, 2, 0, 0 ) fcFlexSizer:AddGrowableCol( 0 ) + fcFlexSizer:AddGrowableRow( 0 ) ! local fcListBox = wx.wxListBox( panel, ID_LISTBOX, wx.wxDefaultPosition, wx.wxSize(80,100), listStrings, wx.wxLB_SINGLE ) fcListBox:SetSelection(0) fcFlexSizer:AddWindow( fcListBox, 0, wx.wxGROW+wx.wxALIGN_CENTER_HORIZONTAL+wx.wxALL, 5 ) *************** *** 2858,2888 **** local fcBoxSizer = wx.wxBoxSizer( wx.wxVERTICAL ) ! --local fcSampleText = wx.wxStaticText( parent, ID_SAMPLE_TEXT, "Sample Text", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) ! --fcBoxSizer:AddWindow( fcSampleText, 0, wx.wxALIGN_CENTER+wx.wxALL, 5 ); ! local sampleWin = wx.wxWindow(parent, ID_SAMPLE_TEXT, wx.wxDefaultPosition, wx.wxSize(80,80)) fcBoxSizer:AddWindow( sampleWin, 0, wx.wxALIGN_CENTER+wx.wxALL, 5 ); ! local fontButton = wx.wxButton( parent, ID_FONT_BUTTON, "Choose Font", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) fcBoxSizer:AddWindow( fontButton, 0, wx.wxGROW+wx.wxALIGN_CENTER_VERTICAL+wx.wxALL, 5 ) ! local colourButton = wx.wxButton( parent, ID_COLOUR_BUTTON, "Choose Color", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) fcBoxSizer:AddWindow( colourButton, 0, wx.wxGROW+wx.wxALIGN_CENTER_VERTICAL+wx.wxALL, 5 ) fcFlexSizer:AddSizer( fcBoxSizer, 0, wx.wxALIGN_CENTER+wx.wxALL, 5 ) - fcStaticSizer:AddSizer( fcFlexSizer, 0, wx.wxGROW+wx.wxALIGN_CENTER_VERTICAL, 5 ) - mainSizer:AddSizer( fcStaticSizer, 0, wx.wxGROW+wx.wxALIGN_CENTER_VERTICAL+wx.wxALL, 5 ) - - local buttonSizer = wx.wxBoxSizer( wx.wxHORIZONTAL ) - - local okButton = wx.wxButton( parent, wx.wxID_OK, "&OK", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) - buttonSizer:AddWindow( okButton, 0, wx.wxALIGN_CENTER+wx.wxALL, 5 ) - local cancelButton = wx.wxButton( parent, wx.wxID_CANCEL, "&Cancel", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) - buttonSizer:AddWindow( cancelButton, 0, wx.wxALIGN_CENTER+wx.wxALL, 5 ) - local applyButton = wx.wxButton( parent, wx.wxID_APPLY, "&Apply", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) - buttonSizer:AddWindow( applyButton, 0, wx.wxALIGN_CENTER+wx.wxALL, 5 ) - - mainSizer:AddSizer( buttonSizer, 0, wx.wxALIGN_CENTER+wx.wxALL, 5 ) ! parent:SetSizer( mainSizer ) ! mainSizer:SetSizeHints( dialog ) sampleWin:ConnectEvent(wx.wxEVT_PAINT, --- 2856,2871 ---- local fcBoxSizer = wx.wxBoxSizer( wx.wxVERTICAL ) ! local sampleWin = wx.wxWindow(panel, ID_SAMPLE_TEXT, wx.wxDefaultPosition, wx.wxSize(100,100)) fcBoxSizer:AddWindow( sampleWin, 0, wx.wxALIGN_CENTER+wx.wxALL, 5 ); ! local fontButton = wx.wxButton( panel, ID_FONT_BUTTON, "Choose Font", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) fcBoxSizer:AddWindow( fontButton, 0, wx.wxGROW+wx.wxALIGN_CENTER_VERTICAL+wx.wxALL, 5 ) ! local colourButton = wx.wxButton( panel, ID_COLOUR_BUTTON, "Choose Color", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) fcBoxSizer:AddWindow( colourButton, 0, wx.wxGROW+wx.wxALIGN_CENTER_VERTICAL+wx.wxALL, 5 ) fcFlexSizer:AddSizer( fcBoxSizer, 0, wx.wxALIGN_CENTER+wx.wxALL, 5 ) ! mainSizer:AddSizer( fcFlexSizer, 1, wx.wxGROW+wx.wxALIGN_CENTER_VERTICAL, 5 ) ! panel:SetSizer( mainSizer ) sampleWin:ConnectEvent(wx.wxEVT_PAINT, *************** *** 2894,2898 **** local function SetFontSize(size, width, height, font) ! -- alternate way, but it fails for font; that can't scale large enough --local f = wx.wxNullFont:NewSize(wx.wxSize(width, height), font:GetFamily(), font:GetStyle(), font:GetWeight(), font:GetUnderlined(), font:GetFaceName()) --font:SetPointSize(f:GetPointSize()) --- 2877,2881 ---- local function SetFontSize(size, width, height, font) ! -- alternate way, but it fails for fonts that can't scale large enough --local f = wx.wxNullFont:NewSize(wx.wxSize(width, height), font:GetFamily(), font:GetStyle(), font:GetWeight(), font:GetUnderlined(), font:GetFaceName()) --font:SetPointSize(f:GetPointSize()) *************** *** 2978,2995 **** end) ! dialog:ConnectEvent(ID_LISTBOX, wx.wxEVT_COMMAND_LISTBOX_SELECTED, function (event) local sel = event:GetSelection() + 1 ! dialog:FindWindow(ID_FONT_BUTTON):Enable(listBoxValues[sel].font ~= nil) ! dialog:FindWindow(ID_COLOUR_BUTTON):Enable(listBoxValues[sel].colour ~= nil) colourButton:SetForegroundColour(listBoxValues[sel].colour) sampleWin:Refresh(false) end) ! dialog:ConnectEvent(ID_FONT_BUTTON, wx.wxEVT_COMMAND_BUTTON_CLICKED, function (event) local sel = fcListBox:GetSelection() + 1 local f = listBoxValues[sel].font ! f = wx.wxGetFontFromUser(dialog, f) if f:Ok() then listBoxValues[sel].font = f --- 2961,2978 ---- end) ! panel:ConnectEvent(ID_LISTBOX, wx.wxEVT_COMMAND_LISTBOX_SELECTED, function (event) local sel = event:GetSelection() + 1 ! panel:FindWindow(ID_FONT_BUTTON):Enable(listBoxValues[sel].font ~= nil) ! panel:FindWindow(ID_COLOUR_BUTTON):Enable(listBoxValues[sel].colour ~= nil) colourButton:SetForegroundColour(listBoxValues[sel].colour) sampleWin:Refresh(false) end) ! panel:ConnectEvent(ID_FONT_BUTTON, wx.wxEVT_COMMAND_BUTTON_CLICKED, function (event) local sel = fcListBox:GetSelection() + 1 local f = listBoxValues[sel].font ! f = wx.wxGetFontFromUser(panel, f) if f:Ok() then listBoxValues[sel].font = f *************** *** 2998,3006 **** sampleWin:Refresh(false) end) ! dialog:ConnectEvent(ID_COLOUR_BUTTON, wx.wxEVT_COMMAND_BUTTON_CLICKED, function (event) local sel = fcListBox:GetSelection() + 1 local c = listBoxValues[sel].colour ! c = wx.wxGetColourFromUser(dialog, c) if c:Ok() then listBoxValues[sel].colour = c --- 2981,2989 ---- sampleWin:Refresh(false) end) ! panel:ConnectEvent(ID_COLOUR_BUTTON, wx.wxEVT_COMMAND_BUTTON_CLICKED, function (event) local sel = fcListBox:GetSelection() + 1 local c = listBoxValues[sel].colour ! c = wx.wxGetColourFromUser(panel, c) if c:Ok() then listBoxValues[sel].colour = c *************** *** 3010,3014 **** end) ! local function ApplyChanges() sudokuGUI.valueColour = listBoxValues[listBoxIdx.valueColour].colour sudokuGUI.initValueColour = listBoxValues[listBoxIdx.initValueColour].colour --- 2993,2997 ---- end) ! function sudokuGUI.PreferencesDialogPageUI.Apply() sudokuGUI.valueColour = listBoxValues[listBoxIdx.valueColour].colour sudokuGUI.initValueColour = listBoxValues[listBoxIdx.initValueColour].colour *************** *** 3035,3045 **** end dialog:ConnectEvent(wx.wxID_APPLY, wx.wxEVT_COMMAND_BUTTON_CLICKED, function (event) ! ApplyChanges() end) dialog:ConnectEvent(wx.wxID_OK, wx.wxEVT_COMMAND_BUTTON_CLICKED, function (event) ! ApplyChanges() event:Skip() end) --- 3018,3229 ---- end + return panel + end + + sudokuGUI.PreferencesDialogPageShow = {} + + function sudokuGUI.PreferencesDialogPageShow.Create(parent) + local panel = wx.wxPanel(parent, wx.wxID_ANY) + + local ID_LISTBOX = 10 + + local listStrings = + { + "All naked groups", + "All hidden groups", + "Naked pairs", + "Naked triplets", + "Naked quads", + "Hidden pairs", + "Hidden triplets", + "Hidden quads" + } + + local listBoxValues = + { + sudokuGUI.ID_SHOW_NAKED, + sudokuGUI.ID_SHOW_HIDDEN, + sudokuGUI.ID_SHOW_NAKEDPAIRS, + sudokuGUI.ID_SHOW_NAKEDTRIPLETS, + sudokuGUI.ID_SHOW_NAKEDQUADS, + sudokuGUI.ID_SHOW_HIDDENPAIRS, + sudokuGUI.ID_SHOW_HIDDENTRIPLETS, + sudokuGUI.ID_SHOW_HIDDENQUADS + } + + -- Create the dialog ------------------------------------------------------ + + local mainSizer = wx.wxBoxSizer( wx.wxVERTICAL ) + local showListBox = wx.wxCheckListBox( panel, ID_LISTBOX, wx.wxDefaultPosition, wx.wxSize(80,100), listStrings, wx.wxLB_SINGLE ) + mainSizer:AddWindow( showListBox, 1, wx.wxGROW+wx.wxALIGN_CENTER_HORIZONTAL+wx.wxALL, 5 ) + panel:SetSizer( mainSizer ) + + for n = 0, showListBox:GetCount()-1 do + showListBox:Check(n, sudokuGUI.menuCheckIDs[listBoxValues[n+1]]) + end + + local function CheckRange(n_start, n_end, check) + for n = n_start, n_end do + showListBox:Check(n, check) + end + end + local function RangeChecked(n_start, n_end) + for n = n_start, n_end do + if not showListBox:IsChecked(n) then return false end + end + return true + end + + panel:ConnectEvent(ID_LISTBOX, wx.wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, + function (event) + local sel = event:GetSelection() + local checked = showListBox:IsChecked(sel) + local id = listBoxValues[sel+1] + if id == sudokuGUI.ID_SHOW_NAKED then + CheckRange(2, 4, checked) + elseif id == sudokuGUI.ID_SHOW_HIDDEN then + CheckRange(5, 7, checked) + else + showListBox:Check(0, RangeChecked(2, 4)) + showListBox:Check(1, RangeChecked(5, 7)) + end + end) + + function sudokuGUI.PreferencesDialogPageShow.Apply() + for n = 0, showListBox:GetCount()-1 do + sudokuGUI.menuCheckIDs[listBoxValues[n+1]] = showListBox:IsChecked(n) + end + sudokuGUI.UpdateTable() + end + + return panel + end + + sudokuGUI.PreferencesDialogPageSolve = {} + + function sudokuGUI.PreferencesDialogPageSolve.Create(parent) + local panel = wx.wxPanel(parent, wx.wxID_ANY) + + local ID_LISTBOX = 10 + + local listStrings = + { + "All naked groups", + "All hidden groups", + "Naked pairs", + "Naked triplets", + "Naked quads", + "Hidden pairs", + "Hidden triplets", + "Hidden quads" + } + + local listBoxValues = + { + sudokuGUI.ID_ELIMINATE_NAKED, + sudokuGUI.ID_ELIMINATE_HIDDEN, + sudokuGUI.ID_ELIMINATE_NAKEDPAIRS, + sudokuGUI.ID_ELIMINATE_NAKEDTRIPLETS, + sudokuGUI.ID_ELIMINATE_NAKEDQUADS, + sudokuGUI.ID_ELIMINATE_HIDDENPAIRS, + sudokuGUI.ID_ELIMINATE_HIDDENTRIPLETS, + sudokuGUI.ID_ELIMINATE_HIDDENQUADS + } + + -- Create the dialog ------------------------------------------------------ + + local mainSizer = wx.wxBoxSizer( wx.wxVERTICAL ) + local showListBox = wx.wxCheckListBox( panel, ID_LISTBOX, wx.wxDefaultPosition, wx.wxSize(80,100), listStrings, wx.wxLB_SINGLE ) + mainSizer:AddWindow( showListBox, 1, wx.wxGROW+wx.wxALIGN_CENTER_HORIZONTAL+wx.wxALL, 5 ) + panel:SetSizer( mainSizer ) + + for n = 0, showListBox:GetCount()-1 do + showListBox:Check(n, sudokuGUI.menuCheckIDs[listBoxValues[n+1]]) + end + + local function CheckRange(n_start, n_end, check) + for n = n_start, n_end do + showListBox:Check(n, check) + end + end + local function RangeChecked(n_start, n_end) + for n = n_start, n_end do + if not showListBox:IsChecked(n) then return false end + end + return true + end + + panel:ConnectEvent(ID_LISTBOX, wx.wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, + function (event) + local sel = event:GetSelection() + local checked = showListBox:IsChecked(sel) + local id = listBoxValues[sel+1] + if id == sudokuGUI.ID_ELIMINATE_NAKED then + CheckRange(2, 4, checked) + elseif id == sudokuGUI.ID_ELIMINATE_HIDDEN then + CheckRange(5, 7, checked) + else + showListBox:Check(0, RangeChecked(2, 4)) + showListBox:Check(1, RangeChecked(5, 7)) + end + end) + + function sudokuGUI.PreferencesDialogPageSolve.Apply() + for n = 0, showListBox:GetCount()-1 do + sudokuGUI.menuCheckIDs[listBoxValues[n+1]] = showListBox:IsChecked(n) + end + sudokuGUI.UpdateTable() + end + + return panel + end + + function sudokuGUI.PreferencesDialog() + local dialog = wx.wxDialog(sudokuGUI.frame, wx.wxID_ANY, + "wxLuaSudoku - Preferences", + wx.wxDefaultPosition, wx.wxDefaultSize, + wx.wxDEFAULT_DIALOG_STYLE+wx.wxRESIZE_BORDER) + + local panel = wx.wxPanel(dialog, wx.wxID_ANY) + local notebook = wx.wxNotebook(panel, wx.wxID_ANY) + + local notebookPages = {} + local page1 = sudokuGUI.PreferencesDialogPageUI.Create(notebook) + notebook:AddPage(page1, "Fonts & Colors", true) + notebookPages[1] = sudokuGUI.PreferencesDialogPageUI + + local page2 = sudokuGUI.PreferencesDialogPageShow.Create(notebook) + notebook:AddPage(page2, "Show groups", false) + notebookPages[2] = sudokuGUI.PreferencesDialogPageShow + + local page3 = sudokuGUI.PreferencesDialogPageSolve.Create(notebook) + notebook:AddPage(page3, "Solve groups", false) + notebookPages[3] = sudokuGUI.PreferencesDialogPageSolve + + local mainSizer = wx.wxBoxSizer( wx.wxVERTICAL ) + + local buttonSizer = wx.wxBoxSizer( wx.wxHORIZONTAL ) + local okButton = wx.wxButton( panel, wx.wxID_OK, "&OK", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) + buttonSizer:AddWindow( okButton, 0, wx.wxALIGN_CENTER+wx.wxALL, 5 ) + local cancelButton = wx.wxButton( panel, wx.wxID_CANCEL, "&Cancel", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) + buttonSizer:AddWindow( cancelButton, 0, wx.wxALIGN_CENTER+wx.wxALL, 5 ) + local applyButton = wx.wxButton( panel, wx.wxID_APPLY, "&Apply", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) + buttonSizer:AddWindow( applyButton, 0, wx.wxALIGN_CENTER+wx.wxALL, 5 ) + + mainSizer:AddWindow( notebook, 1, wx.wxGROW+wx.wxALIGN_CENTER, 0 ) + mainSizer:AddSizer( buttonSizer, 0, wx.wxALIGN_CENTER+wx.wxALL, 5 ) + panel:SetSizer( mainSizer ) + mainSizer:SetSizeHints( dialog ) + + dialog:ConnectEvent(wx.wxID_APPLY, wx.wxEVT_COMMAND_BUTTON_CLICKED, function (event) ! local sel = notebook:GetSelection() ! notebookPages[sel+1].Apply() end) dialog:ConnectEvent(wx.wxID_OK, wx.wxEVT_COMMAND_BUTTON_CLICKED, function (event) ! local sel = notebook:GetSelection() ! notebookPages[sel+1].Apply() event:Skip() end) *************** *** 3600,3608 **** } local s = sudoku.CreateTable() s = sudoku.SetValues(values, s) sudokuGUI.sudokuTables_pos = 1 sudokuGUI.sudokuTables[1] = s ! sudokuGUI.sudokuSolnTable = sudokuGUI.SolveBruteForce(sudokuGUI.sudokuTables[1]) sudokuGUI.panel = wx.wxPanel(sudokuGUI.frame, wx.wxID_ANY) --- 3784,3810 ---- } + local solution = + { + 7,1,2, 6,3,8, 9,4,5, + 3,4,9, 5,7,2, 6,1,8, + 8,5,6, 4,9,1, 7,3,2, + + 2,6,8, 9,4,5, 3,7,1, + 5,9,1, 7,8,3, 2,6,4, + 4,3,7, 1,2,6, 5,8,9, + + 9,7,5, 3,1,4, 8,2,6, + 6,2,4, 8,5,7, 1,9,3, + 1,8,3, 2,6,9, 4,5,7 + } + local s = sudoku.CreateTable() s = sudoku.SetValues(values, s) sudokuGUI.sudokuTables_pos = 1 sudokuGUI.sudokuTables[1] = s ! ! sudokuGUI.sudokuSolnTable = sudoku.CreateTable() ! sudoku.SetValues(solution, sudokuGUI.sudokuSolnTable) ! -- sudokuGUI.SolveBruteForce(sudokuGUI.sudokuTables[1]) sudokuGUI.panel = wx.wxPanel(sudokuGUI.frame, wx.wxID_ANY) |