stv-devel Mailing List for OpenSTV -- STV software and IRV software
Brought to you by:
jco8
You can subscribe to this list here.
2005 |
Jan
|
Feb
(20) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2006 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(104) |
Aug
(28) |
Sep
(24) |
Oct
(31) |
Nov
(4) |
Dec
|
2007 |
Jan
|
Feb
(40) |
Mar
(45) |
Apr
|
May
(23) |
Jun
(44) |
Jul
(31) |
Aug
(2) |
Sep
|
Oct
|
Nov
(21) |
Dec
(31) |
2008 |
Jan
(3) |
Feb
(55) |
Mar
|
Apr
(17) |
May
(10) |
Jun
|
Jul
(1) |
Aug
(3) |
Sep
(4) |
Oct
(9) |
Nov
(24) |
Dec
(4) |
2009 |
Jan
(15) |
Feb
(35) |
Mar
(47) |
Apr
(76) |
May
(56) |
Jun
(51) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Jonathan L. <jlu...@po...> - 2009-06-25 19:16:13
|
California makes a distinction between general law and charter cities (or counties). A general law city, the default, has most of its governance specified in the state code. A charter, on the other hand, puts the details of governance in the hands of the city/county. This has complicated the adoption of new voting methods by general law cities. A charter city can adopt, say, STV by amending its charter; a general law city cannot. So, for example, the city of Davis passed an IRV/STV initiative a couple of years ago, but being a general law city cannot start using it until it either a) becomes a charter city, or b) has special enabling legislation passed on its behalf. A year or two ago, the legislature passed a bill that would have enabled general law cities and counties to adopt IRV/STV as part of the general law framework. Schwarzenegger vetoed the bill (for rather bogus reasons, but there you are). AB 1121 is another shot, this time couched as a trial limited to 10 cities or counties, and expiring unless renewed or made permanent. Here's the current bill: http://www.leginfo.ca.gov/pub/09-10/bill/asm/ab_1101-1150/ab_1121_bill_20090428_amended_asm_v98.pdf Section 10059 specifies an STV method, essentially yet another variation on fractional transfer. I'm posting it here for feedback. I see a couple of problems with the spec (substantive ones, not just "it's not Meek"), and I'm curious to know what you guys make of it. |
From: Jeffrey O'N. <jc...@co...> - 2009-06-25 18:21:10
|
I'd like to have an option to have a window pop up to ask the user to break ties and the other option would be random. I think allowing a user to enter a RNG seed is too confusing for the average user. On Thu, Jun 25, 2009 at 12:21 PM, Jonathan Lundell<jlu...@po...> wrote: > Dave Neary writes on the public list (among other things), > >> It also appears that ties are always broken the same way over repeated >> runs using this method. > > > I don't really think that this is problematical, and of course we need > repeatability. But in my Perl counter I allowed the user to seed the > RNG, the idea being that a sufficiently unpredictable value (say the > integer portion of the closing DJIA on election day) could be used to > avoid any chance at all that the predictability of the RNG could be > used to manipulate the election. > > Nobody every made use of that feature, to my knowledge, but it was a > reassurance. > > ------------------------------------------------------------------------------ > _______________________________________________ > STV-Devel mailing list > STV...@li... > https://lists.sourceforge.net/lists/listinfo/stv-devel > |
From: Jonathan L. <jlu...@po...> - 2009-06-25 16:21:17
|
Dave Neary writes on the public list (among other things), > It also appears that ties are always broken the same way over repeated > runs using this method. I don't really think that this is problematical, and of course we need repeatability. But in my Perl counter I allowed the user to seed the RNG, the idea being that a sufficiently unpredictable value (say the integer portion of the closing DJIA on election day) could be used to avoid any chance at all that the predictability of the RNG could be used to manipulate the election. Nobody every made use of that feature, to my knowledge, but it was a reassurance. |
From: <jlu...@us...> - 2009-06-22 06:35:54
|
Revision: 552 http://stv.svn.sourceforge.net/stv/?rev=552&view=rev Author: jlundell Date: 2009-06-22 06:35:52 +0000 (Mon, 22 Jun 2009) Log Message: ----------- remove results menu rearrange menu methods to reflect current menus remove M accelerator (conflict under OS X) fiddle with capitalization close-console-tab iff only tab update help menu references Modified Paths: -------------- trunk/Help.html trunk/OpenSTV.py Modified: trunk/Help.html =================================================================== --- trunk/Help.html 2009-06-21 21:34:00 UTC (rev 551) +++ trunk/Help.html 2009-06-22 06:35:52 UTC (rev 552) @@ -87,16 +87,17 @@ <p>The election results will appear in a new tab. You than have several options for saving the results. You can copy and paste the -text into a different program, or using the Results menu, you can save +text into a different program, or using the File menu, you can save the results in one of three formats. The text format is exactly what you see on the screen. The html format can viewed in a browser. The CSV (comma separated value) output is used by the Electoral Reform Society and can be loaded into any spreadsheet program. </p> -<p>The Results menu also allows you to delete the election results in -a tab, but you can't delete the console tab. The font size in any tab -can be changed to the desired size. If the election results are wider +<p>The File menu also allows you to close the tabs containing election +results; you can't close the console tab unless all results tabs have been +closed. The font size in any tab can be changed to the desired size +via the Options menu. If the election results are wider than the window size, then choosing a smaller font size may allow for easier viewing of election results.</p> Modified: trunk/OpenSTV.py =================================================================== --- trunk/OpenSTV.py 2009-06-21 21:34:00 UTC (rev 551) +++ trunk/OpenSTV.py 2009-06-22 06:35:52 UTC (rev 552) @@ -149,21 +149,21 @@ # File menu FileMenu = wx.Menu() self.AddMenuItem(FileMenu, 'Run Election...\tCtrl+E', - 'Run Election...', self.OnRunElection) + 'Run election...', self.OnRunElection) FileMenu.AppendSeparator() self.AddMenuItem(FileMenu, 'New Ballot File...\tCtrl+N', - 'New Ballot File...', self.OnNewBF) + 'New ballot file...', self.OnNewBF) self.AddMenuItem(FileMenu, 'Edit Ballot File...\tCtrl+O', - 'Edit Ballot File...', self.OnEditBF) + 'Edit ballot file...', self.OnEditBF) FileMenu.AppendSeparator() self.AddMenuItem(FileMenu, 'Close Tab\tCtrl+W', 'Close Tab', self.OnCloseTab) FileMenu.AppendSeparator() - self.AddMenuItem(FileMenu, 'Save Results as CSV...', + self.AddMenuItem(FileMenu, 'Save Results As CSV...', 'Save results as CSV', self.OnSaveResultsCSV) - self.AddMenuItem(FileMenu, 'Save Results as text...', + self.AddMenuItem(FileMenu, 'Save Results As Text...', 'Save results as text', self.OnSaveResultsText) - self.AddMenuItem(FileMenu, 'Save Results as HTML...', + self.AddMenuItem(FileMenu, 'Save Results As HTML...', 'Save results as HTML', self.OnSaveResultsHTML) id = self.AddMenuItem(FileMenu, 'Exit', 'Exit the application', self.OnExit, "Exit") @@ -174,12 +174,12 @@ # Edit menu EditMenu = wx.Menu() self.AddMenuItem(EditMenu, '&Copy\tCtrl+C', 'Copy', self.OnCopy) - self.AddMenuItem(EditMenu, 'Select All\tCtrl+A', 'Select All', self.OnSelectAll) + self.AddMenuItem(EditMenu, 'Select All\tCtrl+A', 'Select all', self.OnSelectAll) self.menuBar.Append(EditMenu, '&Edit') # Options menu OptionsMenu = wx.Menu() - self.AddMenuItem(OptionsMenu, 'Show All Methods\tCtrl+M', 'Show All Methods', + self.AddMenuItem(OptionsMenu, 'Show All Methods', 'Show all methods', self.OnShowAll, "Check") subMenu = wx.Menu() self.AddMenuItem(subMenu, '6', '6', self.OnFontSize) @@ -195,34 +195,6 @@ self.menuBar.Append(OptionsMenu, '&Options') - # Results menu - ResultsMenu = wx.Menu() - - self.AddMenuItem(ResultsMenu, 'Delete Tab', 'Delete Tab', - self.OnDeleteTab) - - subMenu = wx.Menu() - self.AddMenuItem(subMenu, '6', '6', self.OnFontSize) - self.AddMenuItem(subMenu, '7', '7', self.OnFontSize) - self.AddMenuItem(subMenu, '8', '8', self.OnFontSize) - self.AddMenuItem(subMenu, '9', '9', self.OnFontSize) - self.AddMenuItem(subMenu, '10', '10', self.OnFontSize) - self.AddMenuItem(subMenu, '11', '11', self.OnFontSize) - self.AddMenuItem(subMenu, '12', '12', self.OnFontSize) - self.AddMenuItem(subMenu, '13', '13', self.OnFontSize) - self.AddMenuItem(subMenu, '14', '14', self.OnFontSize) - ResultsMenu.AppendMenu(wx.NewId(), "Font Size", subMenu) - - ResultsMenu.AppendSeparator() - self.AddMenuItem(ResultsMenu, 'Save Results as CSV...', - 'Save results as CSV', self.OnSaveResultsCSV) - self.AddMenuItem(ResultsMenu, 'Save Results as text...', - 'Save results as text', self.OnSaveResultsText) - self.AddMenuItem(ResultsMenu, 'Save Results as HTML...', - 'Save results as HTML', self.OnSaveResultsHTML) - - #self.menuBar.Append(ResultsMenu, '&Results') - # Help menu HelpMenu = wx.Menu() @@ -283,22 +255,6 @@ ### File Menu - def OnCloseTab(self, event): - - n = self.notebook.GetSelection() - if n == 0: - pages = self.notebook.GetPageCount() - if pages > 1: - return # don't close console if there are open results pages - self.OnCloseWindow(event) # otherwise close window - return - - # The index into TallyList is off by one because of the console tab - self.notebook.DeletePage(n) - self.TallyList.pop(n-1) - - ### - def OnRunElection(self, event): # Get the ballot filename and election method @@ -366,84 +322,23 @@ BFE.Show(True) ### - - def OnExit(self, event): - self.Close() - ### - - def OnCloseWindow(self, event): - childrenList = self.GetChildren() - for child in childrenList: - # If the child is a frame, then it is a BFE - if child.GetClassName() == "wxFrame": - # Try to close the child, this will return true if the user selects - # "yes" or "no" and false if the user selects "cancel" - if not child.Close(): - break - else: - # This only happens if the user did not select cancel for any BFE - self.Destroy() - - ### Edit Menu - - def OnCopy(self, event): - n = self.notebook.GetSelection() - text = self.notebook.GetPage(n).GetStringSelection() - do = wx.TextDataObject() - do.SetText(text) - wx.TheClipboard.Open() - wx.TheClipboard.SetData(do) - wx.TheClipboard.Close() - - ### - - def OnSelectAll(self, event): - n = self.notebook.GetSelection() - self.notebook.GetPage(n).SetSelection(-1, -1) + def OnCloseTab(self, event): - ### Options Menu Methods - - def OnShowAll(self, event): - id = event.GetId() - showAll = self.GetMenuBar().FindItemById(id).IsChecked() - if showAll: - self.methods = self.methods2 - else: - self.methods = self.methods1 - - ### Results Menu Methods - - def OnDeleteTab(self, event): - n = self.notebook.GetSelection() if n == 0: - wx.MessageBox("Can't delete the Console.", "Error", wx.OK|wx.ICON_ERROR) + pages = self.notebook.GetPageCount() + if pages > 1: + return # don't close console if there are open results pages + self.OnCloseWindow(event) # otherwise close window return - dlg = wx.MessageDialog(self, 'Delete current tab?', 'Warning', - wx.YES_NO | wx.ICON_INFORMATION) - response = dlg.ShowModal() - dlg.Destroy() - if response != wx.ID_YES: - return - # The index into TallyList is off by one because of the console tab self.notebook.DeletePage(n) self.TallyList.pop(n-1) ### - def OnFontSize(self, event): - id = event.GetId() - fontSize = int(self.menuBar.FindItemById(id).GetLabel()) - n = self.notebook.GetSelection() - font = self.notebook.GetPage(n).GetFont() - font.SetPointSize(fontSize) - self.notebook.GetPage(n).SetFont(font) - - ### - def OnSaveResultsCSV(self, event): n = self.notebook.GetSelection() @@ -517,6 +412,63 @@ f.write(html) f.close() + ### + + def OnExit(self, event): + self.Close() + + ### + + def OnCloseWindow(self, event): + childrenList = self.GetChildren() + for child in childrenList: + # If the child is a frame, then it is a BFE + if child.GetClassName() == "wxFrame": + # Try to close the child, this will return true if the user selects + # "yes" or "no" and false if the user selects "cancel" + if not child.Close(): + break + else: + # This only happens if the user did not select cancel for any BFE + self.Destroy() + + ### Edit Menu + + def OnCopy(self, event): + n = self.notebook.GetSelection() + text = self.notebook.GetPage(n).GetStringSelection() + do = wx.TextDataObject() + do.SetText(text) + wx.TheClipboard.Open() + wx.TheClipboard.SetData(do) + wx.TheClipboard.Close() + + ### + + def OnSelectAll(self, event): + n = self.notebook.GetSelection() + self.notebook.GetPage(n).SetSelection(-1, -1) + + ### Options Menu Methods + + def OnShowAll(self, event): + id = event.GetId() + showAll = self.GetMenuBar().FindItemById(id).IsChecked() + if showAll: + self.methods = self.methods2 + else: + self.methods = self.methods1 + + ### + + def OnFontSize(self, event): + id = event.GetId() + fontSize = int(self.menuBar.FindItemById(id).GetLabel()) + n = self.notebook.GetSelection() + font = self.notebook.GetPage(n).GetFont() + font.SetPointSize(fontSize) + self.notebook.GetPage(n).SetFont(font) + ### Help Menu def OnAbout(self, event): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: Jeffrey O'N. <jc...@co...> - 2009-06-22 01:26:07
|
I don't think there is an obvious choice and that we are better off without one. On Sat, Jun 20, 2009 at 3:10 PM, Jonathan Lundell<jlu...@po...> wrote: > Is there an obvious choice among the three Save-Results formats for > the S accelerator? Maybe we're better off without one? |
From: Jeffrey O'N. <jc...@co...> - 2009-06-22 01:25:32
|
You make a good point. Let's do it as you suggest. > I assume you are not suggesting that we have two menu options for closing > tabs, but rather that we > (1) move it from the results menu to the file menu > (2) change the language from "Delete Tab" to "Close Tab" > (3) don't ask for confirmation > > I'm fine with (2) and (3) but I prefer the Close Tab to be in the Results > menu. I see that Firefox has Close Tab in the File menu but I think it > makes sense to have Close Tab in the same menu as the Save Results options. > > That's what I'm proposing, but one thing more. > The universal convention in both Windows and OS X is to put > New/Open/Close/Save/Print in the File menu. So what I'm proposing is to move > both close-tab and save-result to File, and do away with the Results menu > (the remaining font size entry would move to Options). > The File menu would end up looking like this: > > File > Run Election… > ------- > New Ballot File… > Open Ballot File… > ------- > Close Tab > ------- > Save Results as Text… > Save Results as CSV… > Save Results as HTML… > > ...the principle being least surprise: that's where an typical user would > *expect* for new/open/close/save to appear. Sure, the user would eventually > discover them under Results, but why should she have to hunt? It's not a big > deal, but when there's a strong convention, we ought to observe it unless > there's a really compelling reason to do otherwise. > You decide. > |
From: <jlu...@us...> - 2009-06-21 21:34:09
|
Revision: 551 http://stv.svn.sourceforge.net/stv/?rev=551&view=rev Author: jlundell Date: 2009-06-21 21:34:00 +0000 (Sun, 21 Jun 2009) Log Message: ----------- Demoware. This is what I'm proposing (the Results menu is still in the code; I just commented out its append. Modified Paths: -------------- trunk/OpenSTV.py Modified: trunk/OpenSTV.py =================================================================== --- trunk/OpenSTV.py 2009-06-20 00:19:14 UTC (rev 550) +++ trunk/OpenSTV.py 2009-06-21 21:34:00 UTC (rev 551) @@ -148,14 +148,23 @@ # File menu FileMenu = wx.Menu() - self.AddMenuItem(FileMenu, 'Close Tab\tCtrl+W', 'Close Tab', - self.OnCloseTab) self.AddMenuItem(FileMenu, 'Run Election...\tCtrl+E', 'Run Election...', self.OnRunElection) + FileMenu.AppendSeparator() self.AddMenuItem(FileMenu, 'New Ballot File...\tCtrl+N', 'New Ballot File...', self.OnNewBF) self.AddMenuItem(FileMenu, 'Edit Ballot File...\tCtrl+O', 'Edit Ballot File...', self.OnEditBF) + FileMenu.AppendSeparator() + self.AddMenuItem(FileMenu, 'Close Tab\tCtrl+W', 'Close Tab', + self.OnCloseTab) + FileMenu.AppendSeparator() + self.AddMenuItem(FileMenu, 'Save Results as CSV...', + 'Save results as CSV', self.OnSaveResultsCSV) + self.AddMenuItem(FileMenu, 'Save Results as text...', + 'Save results as text', self.OnSaveResultsText) + self.AddMenuItem(FileMenu, 'Save Results as HTML...', + 'Save results as HTML', self.OnSaveResultsHTML) id = self.AddMenuItem(FileMenu, 'Exit', 'Exit the application', self.OnExit, "Exit") if wx.Platform == "__WXMAC__": @@ -165,13 +174,25 @@ # Edit menu EditMenu = wx.Menu() self.AddMenuItem(EditMenu, '&Copy\tCtrl+C', 'Copy', self.OnCopy) - self.AddMenuItem(EditMenu, 'Select All', 'Select All', self.OnSelectAll) + self.AddMenuItem(EditMenu, 'Select All\tCtrl+A', 'Select All', self.OnSelectAll) self.menuBar.Append(EditMenu, '&Edit') # Options menu OptionsMenu = wx.Menu() - self.AddMenuItem(OptionsMenu, 'Show All Methods', 'Show All Methods', + self.AddMenuItem(OptionsMenu, 'Show All Methods\tCtrl+M', 'Show All Methods', self.OnShowAll, "Check") + subMenu = wx.Menu() + self.AddMenuItem(subMenu, '6', '6', self.OnFontSize) + self.AddMenuItem(subMenu, '7', '7', self.OnFontSize) + self.AddMenuItem(subMenu, '8', '8', self.OnFontSize) + self.AddMenuItem(subMenu, '9', '9', self.OnFontSize) + self.AddMenuItem(subMenu, '10', '10', self.OnFontSize) + self.AddMenuItem(subMenu, '11', '11', self.OnFontSize) + self.AddMenuItem(subMenu, '12', '12', self.OnFontSize) + self.AddMenuItem(subMenu, '13', '13', self.OnFontSize) + self.AddMenuItem(subMenu, '14', '14', self.OnFontSize) + OptionsMenu.AppendMenu(wx.NewId(), "Font Size", subMenu) + self.menuBar.Append(OptionsMenu, '&Options') # Results menu @@ -200,7 +221,7 @@ self.AddMenuItem(ResultsMenu, 'Save Results as HTML...', 'Save results as HTML', self.OnSaveResultsHTML) - self.menuBar.Append(ResultsMenu, '&Results') + #self.menuBar.Append(ResultsMenu, '&Results') # Help menu HelpMenu = wx.Menu() @@ -266,7 +287,10 @@ n = self.notebook.GetSelection() if n == 0: - wx.MessageBox("Can't delete the Console.", "Error", wx.OK|wx.ICON_ERROR) + pages = self.notebook.GetPageCount() + if pages > 1: + return # don't close console if there are open results pages + self.OnCloseWindow(event) # otherwise close window return # The index into TallyList is off by one because of the console tab This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: Jonathan L. <jlu...@po...> - 2009-06-20 19:10:50
|
Is there an obvious choice among the three Save-Results formats for the S accelerator? Maybe we're better off without one? |
From: Jonathan L. <jlu...@po...> - 2009-06-20 16:45:29
|
[BTW, there was a problem with SourceForge's mail servers yesterday; some of my messages took 2-3 hours to show up. Hopefully it's fixed; we'll see.] On Jun 20, 2009, at 6:10 AM, Jeffrey O'Neill wrote: > Hi Jonathan, > > I like the accelerators. > > I assume you are not suggesting that we have two menu options for > closing tabs, but rather that we > (1) move it from the results menu to the file menu > (2) change the language from "Delete Tab" to "Close Tab" > (3) don't ask for confirmation > > I'm fine with (2) and (3) but I prefer the Close Tab to be in the > Results menu. I see that Firefox has Close Tab in the File menu but > I think it makes sense to have Close Tab in the same menu as the > Save Results options. That's what I'm proposing, but one thing more. The universal convention in both Windows and OS X is to put New/Open/ Close/Save/Print in the File menu. So what I'm proposing is to move both close-tab and save-result to File, and do away with the Results menu (the remaining font size entry would move to Options). The File menu would end up looking like this: File Run Election… ------- New Ballot File… Open Ballot File… ------- Close Tab ------- Save Results as Text… Save Results as CSV… Save Results as HTML… ...the principle being least surprise: that's where an typical user would *expect* for new/open/close/save to appear. Sure, the user would eventually discover them under Results, but why should she have to hunt? It's not a big deal, but when there's a strong convention, we ought to observe it unless there's a really compelling reason to do otherwise. You decide. > > Jeff > > > On Fri, Jun 19, 2009 at 8:19 PM, <jlu...@us...> > wrote: > Revision: 550 > http://stv.svn.sourceforge.net/stv/?rev=550&view=rev > Author: jlundell > Date: 2009-06-20 00:19:14 +0000 (Sat, 20 Jun 2009) > > Log Message: > ----------- > Experimental: please review > Add keyboard accelerators to selected menu items > Add no-confirm close-tab to File menu > > Modified Paths: > -------------- > trunk/OpenSTV.py > > Modified: trunk/OpenSTV.py > =================================================================== > --- trunk/OpenSTV.py 2009-06-19 23:40:18 UTC (rev 549) > +++ trunk/OpenSTV.py 2009-06-20 00:19:14 UTC (rev 550) > @@ -148,11 +148,13 @@ > > # File menu > FileMenu = wx.Menu() > - self.AddMenuItem(FileMenu, 'Run Election...', > + self.AddMenuItem(FileMenu, 'Close Tab\tCtrl+W', 'Close Tab', > + self.OnCloseTab) > + self.AddMenuItem(FileMenu, 'Run Election...\tCtrl+E', > 'Run Election...', self.OnRunElection) > - self.AddMenuItem(FileMenu, 'New Ballot File...', > + self.AddMenuItem(FileMenu, 'New Ballot File...\tCtrl+N', > 'New Ballot File...', self.OnNewBF) > - self.AddMenuItem(FileMenu, 'Edit Ballot File...', > + self.AddMenuItem(FileMenu, 'Edit Ballot File...\tCtrl+O', > 'Edit Ballot File...', self.OnEditBF) > id = self.AddMenuItem(FileMenu, 'Exit', > 'Exit the application', self.OnExit, "Exit") > @@ -162,7 +164,7 @@ > > # Edit menu > EditMenu = wx.Menu() > - self.AddMenuItem(EditMenu, 'Copy', 'Copy', self.OnCopy) > + self.AddMenuItem(EditMenu, '&Copy\tCtrl+C', 'Copy', self.OnCopy) > self.AddMenuItem(EditMenu, 'Select All', 'Select All', > self.OnSelectAll) > self.menuBar.Append(EditMenu, '&Edit') > > @@ -260,6 +262,19 @@ > > ### File Menu > > + def OnCloseTab(self, event): > + > + n = self.notebook.GetSelection() > + if n == 0: > + wx.MessageBox("Can't delete the Console.", "Error", wx.OK| > wx.ICON_ERROR) > + return > + > + # The index into TallyList is off by one because of the console > tab > + self.notebook.DeletePage(n) > + self.TallyList.pop(n-1) > + > + ### > + > def OnRunElection(self, event): > > # Get the ballot filename and election method |
From: Jeffrey O'N. <jc...@co...> - 2009-06-20 13:10:10
|
Hi Jonathan, I like the accelerators. I assume you are not suggesting that we have two menu options for closing tabs, but rather that we (1) move it from the results menu to the file menu (2) change the language from "Delete Tab" to "Close Tab" (3) don't ask for confirmation I'm fine with (2) and (3) but I prefer the Close Tab to be in the Results menu. I see that Firefox has Close Tab in the File menu but I think it makes sense to have Close Tab in the same menu as the Save Results options. Jeff On Fri, Jun 19, 2009 at 8:19 PM, <jlu...@us...> wrote: > Revision: 550 > http://stv.svn.sourceforge.net/stv/?rev=550&view=rev > Author: jlundell > Date: 2009-06-20 00:19:14 +0000 (Sat, 20 Jun 2009) > > Log Message: > ----------- > Experimental: please review > Add keyboard accelerators to selected menu items > Add no-confirm close-tab to File menu > > Modified Paths: > -------------- > trunk/OpenSTV.py > > Modified: trunk/OpenSTV.py > =================================================================== > --- trunk/OpenSTV.py 2009-06-19 23:40:18 UTC (rev 549) > +++ trunk/OpenSTV.py 2009-06-20 00:19:14 UTC (rev 550) > @@ -148,11 +148,13 @@ > > # File menu > FileMenu = wx.Menu() > - self.AddMenuItem(FileMenu, 'Run Election...', > + self.AddMenuItem(FileMenu, 'Close Tab\tCtrl+W', 'Close Tab', > + self.OnCloseTab) > + self.AddMenuItem(FileMenu, 'Run Election...\tCtrl+E', > 'Run Election...', self.OnRunElection) > - self.AddMenuItem(FileMenu, 'New Ballot File...', > + self.AddMenuItem(FileMenu, 'New Ballot File...\tCtrl+N', > 'New Ballot File...', self.OnNewBF) > - self.AddMenuItem(FileMenu, 'Edit Ballot File...', > + self.AddMenuItem(FileMenu, 'Edit Ballot File...\tCtrl+O', > 'Edit Ballot File...', self.OnEditBF) > id = self.AddMenuItem(FileMenu, 'Exit', > 'Exit the application', self.OnExit, "Exit") > @@ -162,7 +164,7 @@ > > # Edit menu > EditMenu = wx.Menu() > - self.AddMenuItem(EditMenu, 'Copy', 'Copy', self.OnCopy) > + self.AddMenuItem(EditMenu, '&Copy\tCtrl+C', 'Copy', self.OnCopy) > self.AddMenuItem(EditMenu, 'Select All', 'Select All', > self.OnSelectAll) > self.menuBar.Append(EditMenu, '&Edit') > > @@ -260,6 +262,19 @@ > > ### File Menu > > + def OnCloseTab(self, event): > + > + n = self.notebook.GetSelection() > + if n == 0: > + wx.MessageBox("Can't delete the Console.", "Error", > wx.OK|wx.ICON_ERROR) > + return > + > + # The index into TallyList is off by one because of the console tab > + self.notebook.DeletePage(n) > + self.TallyList.pop(n-1) > + > + ### > + > def OnRunElection(self, event): > > # Get the ballot filename and election method > > > This was sent by the SourceForge.net collaborative development platform, > the world's largest Open Source development site. > > > ------------------------------------------------------------------------------ > Are you an open source citizen? Join us for the Open Source Bridge > conference! > Portland, OR, June 17-19. Two days of sessions, one day of unconference: > $250. > Need another reason to go? 24-hour hacker lounge. Register today! > > http://ad.doubleclick.net/clk;215844324;13503038;v?http://opensourcebridge.org > _______________________________________________ > STV-Devel mailing list > STV...@li... > https://lists.sourceforge.net/lists/listinfo/stv-devel > |
From: <jlu...@us...> - 2009-06-20 02:53:12
|
Revision: 550 http://stv.svn.sourceforge.net/stv/?rev=550&view=rev Author: jlundell Date: 2009-06-20 00:19:14 +0000 (Sat, 20 Jun 2009) Log Message: ----------- Experimental: please review Add keyboard accelerators to selected menu items Add no-confirm close-tab to File menu Modified Paths: -------------- trunk/OpenSTV.py Modified: trunk/OpenSTV.py =================================================================== --- trunk/OpenSTV.py 2009-06-19 23:40:18 UTC (rev 549) +++ trunk/OpenSTV.py 2009-06-20 00:19:14 UTC (rev 550) @@ -148,11 +148,13 @@ # File menu FileMenu = wx.Menu() - self.AddMenuItem(FileMenu, 'Run Election...', + self.AddMenuItem(FileMenu, 'Close Tab\tCtrl+W', 'Close Tab', + self.OnCloseTab) + self.AddMenuItem(FileMenu, 'Run Election...\tCtrl+E', 'Run Election...', self.OnRunElection) - self.AddMenuItem(FileMenu, 'New Ballot File...', + self.AddMenuItem(FileMenu, 'New Ballot File...\tCtrl+N', 'New Ballot File...', self.OnNewBF) - self.AddMenuItem(FileMenu, 'Edit Ballot File...', + self.AddMenuItem(FileMenu, 'Edit Ballot File...\tCtrl+O', 'Edit Ballot File...', self.OnEditBF) id = self.AddMenuItem(FileMenu, 'Exit', 'Exit the application', self.OnExit, "Exit") @@ -162,7 +164,7 @@ # Edit menu EditMenu = wx.Menu() - self.AddMenuItem(EditMenu, 'Copy', 'Copy', self.OnCopy) + self.AddMenuItem(EditMenu, '&Copy\tCtrl+C', 'Copy', self.OnCopy) self.AddMenuItem(EditMenu, 'Select All', 'Select All', self.OnSelectAll) self.menuBar.Append(EditMenu, '&Edit') @@ -260,6 +262,19 @@ ### File Menu + def OnCloseTab(self, event): + + n = self.notebook.GetSelection() + if n == 0: + wx.MessageBox("Can't delete the Console.", "Error", wx.OK|wx.ICON_ERROR) + return + + # The index into TallyList is off by one because of the console tab + self.notebook.DeletePage(n) + self.TallyList.pop(n-1) + + ### + def OnRunElection(self, event): # Get the ballot filename and election method This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jlu...@us...> - 2009-06-19 23:40:20
|
Revision: 549 http://stv.svn.sourceforge.net/stv/?rev=549&view=rev Author: jlundell Date: 2009-06-19 23:40:18 +0000 (Fri, 19 Jun 2009) Log Message: ----------- remember last method onNewElection now onRunElection Modified Paths: -------------- trunk/OpenSTV.py Modified: trunk/OpenSTV.py =================================================================== --- trunk/OpenSTV.py 2009-06-16 23:54:56 UTC (rev 548) +++ trunk/OpenSTV.py 2009-06-19 23:40:18 UTC (rev 549) @@ -77,6 +77,7 @@ self.plugins = getMethodPluginClasses() self.methods1 = {} # Methods enabled by default self.methods2 = {} # All methods + self.lastmethod = "Scottish STV" for p in self.plugins: self.methods2[p.longMethodName] = p if p.enabled: @@ -148,7 +149,7 @@ # File menu FileMenu = wx.Menu() self.AddMenuItem(FileMenu, 'Run Election...', - 'Run Election...', self.OnNewElection) + 'Run Election...', self.OnRunElection) self.AddMenuItem(FileMenu, 'New Ballot File...', 'New Ballot File...', self.OnNewBF) self.AddMenuItem(FileMenu, 'Edit Ballot File...', @@ -259,10 +260,10 @@ ### File Menu - def OnNewElection(self, event): + def OnRunElection(self, event): # Get the ballot filename and election method - dlg = ElectionMethodFileDialog(self, self.lastBallotFile, self.methods) + dlg = ElectionMethodFileDialog(self, self.lastBallotFile, self.methods, self.lastmethod) dlg.Center() if dlg.ShowModal() != wx.ID_OK: dlg.Destroy() @@ -270,6 +271,7 @@ filename = dlg.filename self.lastBallotFile = filename method = dlg.method + self.lastmethod = dlg.lastmethod # set new default dlg.Destroy() # Load the ballot file and create an election instance @@ -511,7 +513,7 @@ class ElectionMethodFileDialog(wx.Dialog): - def __init__(self, parent, lastBallotFile, methods): + def __init__(self, parent, lastBallotFile, methods, lastmethod): wx.Dialog.__init__(self, parent, -1, "Select Input File and Method") self.methods = methods @@ -532,8 +534,8 @@ choices = self.methods.keys() choices.sort() self.methodC = wx.Choice(self, -1, choices = choices) - if "Scottish STV" in choices: - self.methodC.SetStringSelection("Scottish STV") + if lastmethod in choices: + self.methodC.SetStringSelection(lastmethod) blank = wx.StaticText(self, -1, "") # Buttons @@ -586,6 +588,7 @@ # Get method name and convert to class key = self.methodC.GetStringSelection() + self.lastmethod = key self.method = self.methods[key] event.Skip() # do normal OK button processing This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: Jeffrey O'N. <jc...@co...> - 2009-06-19 19:42:18
|
If you have an iPhone or iTouch and bookmark the OpenSTV.org web site to the home screen, it now uses a custom icon. It is sort of pointless since the OpenSTV web page isn't mobile friendly and there isn't much reason to access it from a mobile device, so no one other than me may have such a book mark, but it was fun to do... |
From: Jonathan L. <jlu...@po...> - 2009-06-19 03:45:28
|
On Jun 18, 2009, at 6:30 PM, Jonathan Lundell wrote: > On Jun 18, 2009, at 6:23 PM, Jeffrey O'Neill wrote: > >> Thanks for working on this. I believe you are using Perl >> notation. I >> hope I can translate to Python regexes... > > Yes. I think the translation is straightforward. > > One caveat: the ?| notation appears to be a fairly late addition to > Perl, in which case it may well not be supported in Python RE's. If > it's not, then my one-liner fails. I was trying to be too clever. This seems to work: find: ^\s*(".*?"|.*?)\s*(#.*)?$ replace: $1 |
From: Jonathan L. <jlu...@po...> - 2009-06-19 02:19:33
|
On Jun 18, 2009, at 6:23 PM, Jeffrey O'Neill wrote: > Thanks for working on this. I believe you are using Perl notation. I > hope I can translate to Python regexes... Yes. I think the translation is straightforward. One caveat: the ?| notation appears to be a fairly late addition to Perl, in which case it may well not be supported in Python RE's. If it's not, then my one-liner fails. > > On Thu, Jun 18, 2009 at 9:17 PM, Jonathan Lundell > <jlu...@po...> wrote: >> >> On Jun 17, 2009, at 9:01 PM, Jonathan Lundell wrote: >> >>> On Jun 17, 2009, at 8:50 PM, Jeffrey O'Neill wrote: >>> >>>> That almost works, but we need to also ignore a comment after a >>>> quoted string. >>> >>> Good point. This should fix that. I think. >>> >>> s/(^".*?").*/$1/ >>> s/^([^"].*?)\s*(#.*)?/$1/ >> >> Not quite; it fails if the line starts with #. So: >> >> s/^\s*#.*// >> s/(^".*?").*/$1/ >> s/^([^"].*?)\s*(#.*)?/$1/ >> >> or this: >> >> s/^\s*(".*?").*?|(.*?)\s*(#.*)?/$1/ >> >> This RE employs two tricks. One is that ?| resets the capture buffer >> counter, so that regardless of which side of the alternation matches, >> the match is captured in $1. The other is that the second part of the >> alternation is only attempted if the first one fails. >> >> So (after ignoring leading spaces in any event) we capture a quoted >> candidate name if one exists; if not, we capture everything up to a >> comment (defining the comment as starting with \s*#). >> >> Any of these can leave an empty line; I assume that's either OK or >> otherwise handled. |
From: Jeffrey O'N. <jc...@co...> - 2009-06-19 01:23:54
|
Thanks for working on this. I believe you are using Perl notation. I hope I can translate to Python regexes... On Thu, Jun 18, 2009 at 9:17 PM, Jonathan Lundell <jlu...@po...> wrote: > > On Jun 17, 2009, at 9:01 PM, Jonathan Lundell wrote: > > > On Jun 17, 2009, at 8:50 PM, Jeffrey O'Neill wrote: > > > >> That almost works, but we need to also ignore a comment after a > >> quoted string. > > > > Good point. This should fix that. I think. > > > > s/(^".*?").*/$1/ > > s/^([^"].*?)\s*(#.*)?/$1/ > > Not quite; it fails if the line starts with #. So: > > s/^\s*#.*// > s/(^".*?").*/$1/ > s/^([^"].*?)\s*(#.*)?/$1/ > > or this: > > s/^\s*(".*?").*?|(.*?)\s*(#.*)?/$1/ > > This RE employs two tricks. One is that ?| resets the capture buffer > counter, so that regardless of which side of the alternation matches, > the match is captured in $1. The other is that the second part of the > alternation is only attempted if the first one fails. > > So (after ignoring leading spaces in any event) we capture a quoted > candidate name if one exists; if not, we capture everything up to a > comment (defining the comment as starting with \s*#). > > Any of these can leave an empty line; I assume that's either OK or > otherwise handled. > > ------------------------------------------------------------------------------ > Crystal Reports - New Free Runtime and 30 Day Trial > Check out the new simplified licensing option that enables unlimited > royalty-free distribution of the report engine for externally facing > server and web deployment. > http://p.sf.net/sfu/businessobjects > _______________________________________________ > STV-Devel mailing list > STV...@li... > https://lists.sourceforge.net/lists/listinfo/stv-devel |
From: Jonathan L. <jlu...@po...> - 2009-06-19 01:17:31
|
On Jun 17, 2009, at 9:01 PM, Jonathan Lundell wrote: > On Jun 17, 2009, at 8:50 PM, Jeffrey O'Neill wrote: > >> That almost works, but we need to also ignore a comment after a >> quoted string. > > Good point. This should fix that. I think. > > s/(^".*?").*/$1/ > s/^([^"].*?)\s*(#.*)?/$1/ Not quite; it fails if the line starts with #. So: s/^\s*#.*// s/(^".*?").*/$1/ s/^([^"].*?)\s*(#.*)?/$1/ or this: s/^\s*(".*?").*?|(.*?)\s*(#.*)?/$1/ This RE employs two tricks. One is that ?| resets the capture buffer counter, so that regardless of which side of the alternation matches, the match is captured in $1. The other is that the second part of the alternation is only attempted if the first one fails. So (after ignoring leading spaces in any event) we capture a quoted candidate name if one exists; if not, we capture everything up to a comment (defining the comment as starting with \s*#). Any of these can leave an empty line; I assume that's either OK or otherwise handled. |
From: Jonathan L. <jlu...@po...> - 2009-06-18 04:02:00
|
On Jun 17, 2009, at 8:50 PM, Jeffrey O'Neill wrote: > That almost works, but we need to also ignore a comment after a > quoted string. Good point. This should fix that. I think. s/(^".*?").*/$1/ s/^([^"].*?)\s*(#.*)?/$1/ |
From: Jeffrey O'N. <jc...@co...> - 2009-06-18 03:50:14
|
That almost works, but we need to also ignore a comment after a quoted string. The problem is that we need to redo the processing of blt data. Currently, it is done as one as one big blob of data (new lines are ignored so a ballot could span multiple lines) and we should change it to process the data line by line instead. On Wed, Jun 17, 2009 at 11:45 PM, Jonathan Lundell<jlu...@po...> wrote: > On Jun 17, 2009, at 8:23 PM, Jeffrey O'Neill wrote: > >> Yes, I think we should do a release soon. I want to do at least one >> more thing. We now allow comments in ballot files (using "#"). With >> the current implementation, a # in a candidate name (e.g., "Candidate >> #1") or the title will cause the ballot file to fail to load. I'd >> like to fix that but it is not a quick fix. >> >> Anything else we should do for the next release? > > There's nothing on my list; I think it's a good time for a release. > > WRT comments, how about something like this. Untested. > > 1. If the line starts with a quote, keep the quoted string. > 2. If it doesn't, keep everything up to an optional #. > > s/(^".*?")/$1/ > s/^([^"].*?)\s*(#.*)?/$1/ > > ------------------------------------------------------------------------------ > Crystal Reports - New Free Runtime and 30 Day Trial > Check out the new simplified licensing option that enables unlimited > royalty-free distribution of the report engine for externally facing > server and web deployment. > http://p.sf.net/sfu/businessobjects > _______________________________________________ > STV-Devel mailing list > STV...@li... > https://lists.sourceforge.net/lists/listinfo/stv-devel > |
From: Jonathan L. <jlu...@po...> - 2009-06-18 03:45:05
|
On Jun 17, 2009, at 8:23 PM, Jeffrey O'Neill wrote: > Yes, I think we should do a release soon. I want to do at least one > more thing. We now allow comments in ballot files (using "#"). With > the current implementation, a # in a candidate name (e.g., "Candidate > #1") or the title will cause the ballot file to fail to load. I'd > like to fix that but it is not a quick fix. > > Anything else we should do for the next release? There's nothing on my list; I think it's a good time for a release. WRT comments, how about something like this. Untested. 1. If the line starts with a quote, keep the quoted string. 2. If it doesn't, keep everything up to an optional #. s/(^".*?")/$1/ s/^([^"].*?)\s*(#.*)?/$1/ |
From: Jeffrey O'N. <jc...@co...> - 2009-06-18 03:23:16
|
Yes, I think we should do a release soon. I want to do at least one more thing. We now allow comments in ballot files (using "#"). With the current implementation, a # in a candidate name (e.g., "Candidate #1") or the title will cause the ballot file to fail to load. I'd like to fix that but it is not a quick fix. Anything else we should do for the next release? On Wed, Jun 17, 2009 at 2:29 PM, Jonathan Lundell<jlu...@po...> wrote: > On Jun 17, 2009, at 11:17 AM, Jeffrey O'Neill wrote: > >> Please feel free to update the website in any way that you think makes >> sense. I made a few changes to the home page recently to improve the >> page rank for a search for "instant runoff voting" but I have done >> very little other than the occasional blog post. >> >> The most up to date OpenSTV manual is in svn. The one on the website >> could be as old as pSTV 0.9... > > The svn manual is now v1.5-specific, so I think I'll wait until you > release it to update the website. I'll leave it alone for now. Now > that plugins are working, I assume we're close to release? > > ------------------------------------------------------------------------------ > Crystal Reports - New Free Runtime and 30 Day Trial > Check out the new simplified licensing option that enables unlimited > royalty-free distribution of the report engine for externally facing > server and web deployment. > http://p.sf.net/sfu/businessobjects > _______________________________________________ > STV-Devel mailing list > STV...@li... > https://lists.sourceforge.net/lists/listinfo/stv-devel > |
From: Jonathan L. <jlu...@po...> - 2009-06-17 18:30:26
|
On Jun 17, 2009, at 11:17 AM, Jeffrey O'Neill wrote: > Please feel free to update the website in any way that you think makes > sense. I made a few changes to the home page recently to improve the > page rank for a search for "instant runoff voting" but I have done > very little other than the occasional blog post. > > The most up to date OpenSTV manual is in svn. The one on the website > could be as old as pSTV 0.9... The svn manual is now v1.5-specific, so I think I'll wait until you release it to update the website. I'll leave it alone for now. Now that plugins are working, I assume we're close to release? |
From: Jeffrey O'N. <jc...@co...> - 2009-06-17 18:18:34
|
Please feel free to update the website in any way that you think makes sense. I made a few changes to the home page recently to improve the page rank for a search for "instant runoff voting" but I have done very little other than the occasional blog post. The most up to date OpenSTV manual is in svn. The one on the website could be as old as pSTV 0.9... On Wed, Jun 17, 2009 at 10:39 AM, Jonathan Lundell<jlu...@po...> wrote: > I was browsing the site this morning (changed CVD to FairVote), and I > checked some of the links. I wonder if we shouldn't remove the eSTV > link. I grant the desirability of having access to an "official" ERS > counter, but by all appearances the project has died. > > They list support for Windows 98 and NT. The only documentation > pointers now are to a forum site, and the forum site is full of spam, > with no substantive activity since 2005/2006, near as I can tell. > > So I'm ambivalent. It doesn't cost us anything to maintain the link, > but I don't think it's helpful to our readers to send them there. > > And a minor thing. The OpenSTV manual will need a significant update > for v1.5, and in that context I thought I'd add a line to the current > manual identifying it as applying to v1.4, to avoid future confusion. > Before I do that, Jeff, would you please glance at it and confirm that > it's actually the v1.4 manual (and not, say, v1.3)? > > Thanks. > > ------------------------------------------------------------------------------ > Crystal Reports - New Free Runtime and 30 Day Trial > Check out the new simplified licensing option that enables unlimited > royalty-free distribution of the report engine for externally facing > server and web deployment. > http://p.sf.net/sfu/businessobjects > _______________________________________________ > STV-Devel mailing list > STV...@li... > https://lists.sourceforge.net/lists/listinfo/stv-devel > |
From: Jonathan L. <jlu...@po...> - 2009-06-17 14:39:57
|
I was browsing the site this morning (changed CVD to FairVote), and I checked some of the links. I wonder if we shouldn't remove the eSTV link. I grant the desirability of having access to an "official" ERS counter, but by all appearances the project has died. They list support for Windows 98 and NT. The only documentation pointers now are to a forum site, and the forum site is full of spam, with no substantive activity since 2005/2006, near as I can tell. So I'm ambivalent. It doesn't cost us anything to maintain the link, but I don't think it's helpful to our readers to send them there. And a minor thing. The OpenSTV manual will need a significant update for v1.5, and in that context I thought I'd add a line to the current manual identifying it as applying to v1.4, to avoid future confusion. Before I do that, Jeff, would you please glance at it and confirm that it's actually the v1.4 manual (and not, say, v1.3)? Thanks. |
From: <jlu...@us...> - 2009-06-16 23:54:58
|
Revision: 548 http://stv.svn.sourceforge.net/stv/?rev=548&view=rev Author: jlundell Date: 2009-06-16 23:54:56 +0000 (Tue, 16 Jun 2009) Log Message: ----------- Update the File menu choices, and add a section on runElection.py usage. Modified Paths: -------------- trunk/Help.html Modified: trunk/Help.html =================================================================== --- trunk/Help.html 2009-06-16 16:53:22 UTC (rev 547) +++ trunk/Help.html 2009-06-16 23:54:56 UTC (rev 548) @@ -71,8 +71,8 @@ <p>To run an election, you must already have a complete ballot file. If you do not have a complete ballot file, then you can create or edit -a ballot file as described below. To start the process, select "New -Election" from the File menu. +a ballot file as described below. To start the process, select "Run +Election..." from the File menu. </p> <p>The first step is to select the file that contains the ballots and @@ -103,9 +103,9 @@ <p><b>III. Editing Ballots</b></p> <p>OpenSTV has a built-in ballot file editor. If you would like to -create a new ballot file from scratch, select "Create New Ballot File" +create a new ballot file from scratch, select "New Ballot File..." from the File menu. If you would like to edit an existing ballot -file, select "Edit Ballot File" from the File menu. +file, select "Edit Ballot File..." from the File menu. </p> <p>When you create a new ballot file through OpenSTV, it will always @@ -187,7 +187,42 @@ </pre> <p><b>V. Advanced Use</b></p> +<p>Download and install the Linux version of OpenSTV to use OpenSTV from the command line or via scripting.</p> +<p>The <code>runelection.py</code> command runs an election for the given method and ballot file. +Results are printed to stdout.</p> +<pre> + runElection.py [-d] [-r report] [-t tiebreak] method ballotfile + -d: enable debug + -r: report format: text*, html, csv + -t: tiebreak method: random*, alpha, index + *default +</pre> + +<p>The <code>runelection.py</code> command runs an election for the given method and ballot file. +Results are printed to stdout. The following methods are available:</p> + +<blockquote>Approval<br> +Borda<br> +Bucklin<br> +CambridgeSTV<br> +Condorcet<br> +Coombs<br> +ERS97STV<br> +FTSTV<br> +GPCA2000STV<br> +IRV<br> +MeekQXSTV<br> +MeekSTV<br> +NIrelandSTV<br> +QPQ<br> +RTSTV<br> +SNTV<br> +ScottishSTV<br> +SuppVote<br> +WarrenQXSTV<br> +WarrenSTV</blockquote> + <p>You can also write your own Python scripts to run elections. To do this, you would import OpenSTV's Python modules into your own Python program. Here is an example:</p> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |