Skip to content
Snippets Groups Projects
Commit 518ecda9 authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Merge branch...

Merge branch 'ddmr_indexed_mode_mark_all_read_updates_and_newscan_force_indexed_menu_opts' into 'master'

DDMsgReader: Updated behavior for indexed menu R (mark all read) when doing a newscan. Ctrl-S does scan refresh in indexed menu. New R "snap-to" option for the indexed menu. Also, command-line options for forcing use of the indexed mode menu when doing a

See merge request !387
parents 8eea44bc c1af21a5
Branches
Tags
1 merge request!387DDMsgReader: Updated behavior for indexed menu R (mark all read) when doing a newscan. Ctrl-S does scan refresh in indexed menu. New R "snap-to" option for the indexed menu. Also, command-line options for forcing use of the indexed mode menu when doing a
......@@ -129,6 +129,20 @@
* New command-line option: -indexModeScope, which can specify the indexed
* reader scope (group/all) without prompting the user.
* User configuration options for newscan & email only shown when doing those actions
* 2024-01-11 Eric Oulashin Version 1.95
* Removed user option to display indexed mode menu in newscan after all new messages are read.
* Command-line option -indexedMode can now be specified with -search=new_msg_scan to make
* it display the indexed mode menu, regardless of the user setting to use the indexed mode
* menu for a newscan.
* New command-line option: -newscanIndexMenuAfterReadAllNew - Continue to display the
* indexed mode menu after the user has read all new messages during a newscan.
* The following command-line can be used to do a newscan for all sub-boards and continue
* displaying the index mode menu after the user has read all new messages:
* DDMsgReader.js -search=new_msg_scan -indexedMode -indexModeScope=all -newscanIndexMenuAfterReadAllNew
* New indexed mode newscan behavior: R (mark all read) moves to the next sub-board.
* Ctrl-S in the indexed mode menu re-scans sub-boards (to detect more new messages, etc.)
* New DDMsgReader.cfg option for user config default:
* indexedModeMenuSnapToNextWithNewAftarMarkAllRead
*/
 
"use strict";
......@@ -234,8 +248,8 @@ var hexdump = load('hexdump_lib.js');
 
 
// Reader version information
var READER_VERSION = "1.94";
var READER_DATE = "2024-01-08";
var READER_VERSION = "1.95";
var READER_DATE = "2024-01-20";
 
// Keyboard key codes for displaying on the screen
var UP_ARROW = ascii(24);
......@@ -573,7 +587,10 @@ if (gDoDDMR)
readerSubCode = gCmdLineArgVals["subboard"];
}
var msgReader = new DigDistMsgReader(readerSubCode, gCmdLineArgVals);
if (gCmdLineArgVals.indexedmode)
// -indexedMode command-line arg specified and not doing a search (including
// newscan): Do indexed read mode (show all sub-boards rather than only
// sub-boards enabled in the user's newscan configuration)
if (gCmdLineArgVals.indexedmode && msgReader.searchType == SEARCH_NONE)
{
console.attributes = "N";
console.crlf();
......@@ -647,12 +664,23 @@ if (gDoDDMR)
msgReader.SearchMessages("to_user_search");
break;
case SEARCH_MSG_NEWSCAN:
if (!gCmdLineArgVals.suppresssearchtypetext)
var scopeChar = null;
if (typeof(gCmdLineArgVals.indexmodescope) === "string")
{
var argScopeLower = gCmdLineArgVals.indexmodescope.toLowerCase();
if (argScopeLower == "sub" || argScopeLower == "subboard"|| argScopeLower == "sub-board")
scopeChar = "S";
else if (argScopeLower == "group" || argScopeLower == "grp")
scopeChar = "G";
else if (argScopeLower == "all")
scopeChar = "A";
}
if (scopeChar == null && !gCmdLineArgVals.suppresssearchtypetext)
{
console.crlf();
console.putmsg(msgReader.text.newMsgScanText);
}
msgReader.MessageAreaScan(SCAN_CFG_NEW, SCAN_NEW);
msgReader.MessageAreaScan(SCAN_CFG_NEW, SCAN_NEW, scopeChar);
break;
case SEARCH_MSG_NEWSCAN_CUR_SUB:
msgReader.MessageAreaScan(SCAN_CFG_NEW, SCAN_NEW, "S");
......@@ -1123,6 +1151,7 @@ function DigDistMsgReader(pSubBoardCode, pScriptArgs)
markAllRead: "R",
help: "?",
userSettings: CTRL_U,
reScanSubBoards: CTRL_S
};
 
// Message status characters for the message list
......@@ -1180,10 +1209,11 @@ function DigDistMsgReader(pSubBoardCode, pScriptArgs)
// Whether or not the indexed mode sub-board menu should "snap" selection to sub-boards with new messages
// when the menu is shown
indexedModeMenuSnapToFirstWithNew: false,
// For the indexed menu in a newscan, whether or not it should "snap" to the next sub-board with new
// messages after marking all read in a sub-board:
indexedModeMenuSnapToNextWithNewAftarMarkAllRead: true,
// Whether to display the indexed mode newscan menu when there are no new messages
displayIndexedModeMenuIfNoNewMessages: true,
// Whether to show the indexed newscan menu after reading all new messages
showIndexedNewscanMenuAfterReadingAllNewMsgs: true,
// Whether or not to list messages in reverse order
listMessagesInReverse: false,
// Whether or not quitting from the reader goes to the message list (instead of exiting altogether)
......@@ -2488,7 +2518,7 @@ function searchTypeRequiresSearchText(pSearchType)
function DigDistMsgReader_MessageAreaScan(pScanCfgOpt, pScanMode, pScanScopeChar, pOutputMessages)
{
var scanScopeChar = "";
if ((typeof(pScanScopeChar) == "string") && /^[SGA]$/.test(pScanScopeChar))
if ((typeof(pScanScopeChar) === "string") && /^[SGA]$/.test(pScanScopeChar))
scanScopeChar = pScanScopeChar;
else
{
......@@ -2549,8 +2579,8 @@ function DigDistMsgReader_MessageAreaScan(pScanCfgOpt, pScanMode, pScanScopeChar
this.doingNewscan = pScanMode === SCAN_NEW;
 
// If doing a newscan of all sub-boards, and the user has their setting for indexed mode
// for newscan enabled, then do that and return instead of the traditional newscan.
if (pScanCfgOpt === SCAN_CFG_NEW && pScanMode === SCAN_NEW && this.userSettings.useIndexedModeForNewscan)
// for newscan enabled, or the command-line option indexedMode is specified, then do that and return instead of the traditional newscan.
if (pScanCfgOpt === SCAN_CFG_NEW && pScanMode === SCAN_NEW && (this.userSettings.useIndexedModeForNewscan || gCmdLineArgVals.indexedmode))
{
var scanScope = SCAN_SCOPE_ALL;
if (scanScopeChar === "S") scanScope = SCAN_SCOPE_SUB_BOARD;
......@@ -9258,6 +9288,8 @@ function DigDistMsgReader_ReadConfigFile()
this.userSettings.newscanOnlyShowNewMsgs = settingsObj.newscanOnlyShowNewMsgs;
if (typeof(settingsObj.indexedModeMenuSnapToFirstWithNew) === "boolean")
this.userSettings.indexedModeMenuSnapToFirstWithNew = settingsObj.indexedModeMenuSnapToFirstWithNew;
if (typeof(settingsObj.indexedModeMenuSnapToNextWithNewAftarMarkAllRead) === "boolean")
this.userSettings.indexedModeMenuSnapToNextWithNewAftarMarkAllRead = settingsObj.indexedModeMenuSnapToNextWithNewAftarMarkAllRead;
if (typeof(settingsObj.promptDelPersonalEmailAfterReply) === "boolean")
this.userSettings.promptDelPersonalEmailAfterReply = settingsObj.promptDelPersonalEmailAfterReply;
if (typeof(settingsObj.displayIndexedModeMenuIfNoNewMessages) === "boolean")
......@@ -15035,21 +15067,21 @@ function DigDistMsgReader_DoUserSettings_Scrollable(pDrawBottomhelpLineFn, pTopR
 
// Indexed-mode newscan options
var SHOW_INDEXED_NEWSCAN_MENU_IF_NO_NEW_MSGS_OPT_INDEX = -1;
var INDEXED_MODE_NEWSCAN_MENU_AFTER_READING_ALL_NEW_MSGS_OPT_INDEX = -1;
var INDEXED_MODE_MENU_SNAP_TO_NEW_MSGS_OPT_INDEX = -1;
var INDEXED_MODE_MENU_SNAP_TO_NEW_MSGS_WHEN_MARK_ALL_READ_OPT_IDX = -1;
if (this.doingNewscan)
{
SHOW_INDEXED_NEWSCAN_MENU_IF_NO_NEW_MSGS_OPT_INDEX = optionBox.addTextItem(format(optionFormatStr, "Show indexed menu if there are no new messages"));
if (this.userSettings.displayIndexedModeMenuIfNoNewMessages)
optionBox.chgCharInTextItem(SHOW_INDEXED_NEWSCAN_MENU_IF_NO_NEW_MSGS_OPT_INDEX, checkIdx, CHECK_CHAR);
 
INDEXED_MODE_NEWSCAN_MENU_AFTER_READING_ALL_NEW_MSGS_OPT_INDEX = optionBox.addTextItem(format(optionFormatStr, "Show indexed menu after reading all new msgs"));
if (this.userSettings.showIndexedNewscanMenuAfterReadingAllNewMsgs)
optionBox.chgCharInTextItem(INDEXED_MODE_NEWSCAN_MENU_AFTER_READING_ALL_NEW_MSGS_OPT_INDEX, checkIdx, CHECK_CHAR);
INDEXED_MODE_MENU_SNAP_TO_NEW_MSGS_OPT_INDEX = optionBox.addTextItem(format(optionFormatStr, "Index newscan: Snap to sub-boards w/ new msgs"));
if (this.userSettings.indexedModeMenuSnapToFirstWithNew)
optionBox.chgCharInTextItem(INDEXED_MODE_MENU_SNAP_TO_NEW_MSGS_OPT_INDEX, checkIdx, CHECK_CHAR);
INDEXED_MODE_MENU_SNAP_TO_NEW_MSGS_WHEN_MARK_ALL_READ_OPT_IDX = optionBox.addTextItem(format(optionFormatStr, "Index newscan: Sub-board snap w/ mark all read"));
if (this.userSettings.indexedModeMenuSnapToNextWithNewAftarMarkAllRead)
optionBox.chgCharInTextItem(INDEXED_MODE_MENU_SNAP_TO_NEW_MSGS_WHEN_MARK_ALL_READ_OPT_IDX, checkIdx, CHECK_CHAR);
}
 
const INDEX_NEWSCAN_ENTER_SHOWS_MSG_LIST_OPT_INDEX = optionBox.addTextItem(format(optionFormatStr, "Index menu: Enter shows message list"));
......@@ -15080,8 +15112,8 @@ function DigDistMsgReader_DoUserSettings_Scrollable(pDrawBottomhelpLineFn, pTopR
optionToggles[NEWSCAN_ONLY_SHOW_NEW_MSGS_INDEX] = this.userSettings.newscanOnlyShowNewMsgs;
optionToggles[INDEXED_MODE_NEWSCAN_OPT_INDEX] = this.userSettings.useIndexedModeForNewscan;
optionToggles[SHOW_INDEXED_NEWSCAN_MENU_IF_NO_NEW_MSGS_OPT_INDEX] = this.userSettings.displayIndexedModeMenuIfNoNewMessages;
optionToggles[INDEXED_MODE_NEWSCAN_MENU_AFTER_READING_ALL_NEW_MSGS_OPT_INDEX] = this.userSettings.showIndexedNewscanMenuAfterReadingAllNewMsgs;
optionToggles[INDEXED_MODE_MENU_SNAP_TO_NEW_MSGS_OPT_INDEX] = this.userSettings.indexedModeMenuSnapToFirstWithNew;
optionToggles[INDEXED_MODE_MENU_SNAP_TO_NEW_MSGS_WHEN_MARK_ALL_READ_OPT_IDX] = this.userSettings.indexedModeMenuSnapToNextWithNewAftarMarkAllRead;
optionToggles[INDEX_NEWSCAN_ENTER_SHOWS_MSG_LIST_OPT_INDEX] = this.userSettings.enterFromIndexMenuShowsMsgList;
optionToggles[READER_QUIT_TO_MSG_LIST_OPT_INDEX] = this.userSettings.quitFromReaderGoesToMsgList;
optionToggles[PROPMT_DEL_PERSONAL_MSG_AFTER_REPLY_OPT_INDEX] = this.userSettings.promptDelPersonalEmailAfterReply;
......@@ -15126,12 +15158,12 @@ function DigDistMsgReader_DoUserSettings_Scrollable(pDrawBottomhelpLineFn, pTopR
case SHOW_INDEXED_NEWSCAN_MENU_IF_NO_NEW_MSGS_OPT_INDEX:
this.readerObj.userSettings.displayIndexedModeMenuIfNoNewMessages = !this.readerObj.userSettings.displayIndexedModeMenuIfNoNewMessages;
break;
case INDEXED_MODE_NEWSCAN_MENU_AFTER_READING_ALL_NEW_MSGS_OPT_INDEX:
this.readerObj.userSettings.showIndexedNewscanMenuAfterReadingAllNewMsgs = !this.readerObj.userSettings.showIndexedNewscanMenuAfterReadingAllNewMsgs;
break;
case INDEXED_MODE_MENU_SNAP_TO_NEW_MSGS_OPT_INDEX:
this.readerObj.userSettings.indexedModeMenuSnapToFirstWithNew = !this.readerObj.userSettings.indexedModeMenuSnapToFirstWithNew;
break;
case INDEXED_MODE_MENU_SNAP_TO_NEW_MSGS_WHEN_MARK_ALL_READ_OPT_IDX:
this.readerObj.userSettings.indexedModeMenuSnapToNextWithNewAftarMarkAllRead = !this.readerObj.userSettings.indexedModeMenuSnapToNextWithNewAftarMarkAllRead;
break;
case INDEX_NEWSCAN_ENTER_SHOWS_MSG_LIST_OPT_INDEX:
this.readerObj.userSettings.enterFromIndexMenuShowsMsgList = !this.readerObj.userSettings.enterFromIndexMenuShowsMsgList;
break;
......@@ -15246,12 +15278,10 @@ function DigDistMsgReader_DoUserSettings_Traditional()
}
// Indexed-mode newscan options (will only be displayed if doing a newscan)
var SHOW_INDEXED_NEWSCAN_MENU_IF_NO_NEW_MSGS_OPT_NUM = -1;
var INDEXED_MODE_NEWSCAN_MENU_AFTER_READING_ALL_NEW_MSGS_OPT_INDEX = -1;
if (this.doingNewscan)
{
SHOW_INDEXED_NEWSCAN_MENU_IF_NO_NEW_MSGS_OPT_NUM = optNum++;
INDEXED_MODE_NEWSCAN_MENU_AFTER_READING_ALL_NEW_MSGS_OPT_INDEX = optNum++;
HIGHEST_CHOICE_NUM = INDEXED_MODE_NEWSCAN_MENU_AFTER_READING_ALL_NEW_MSGS_OPT_INDEX;
HIGHEST_CHOICE_NUM = SHOW_INDEXED_NEWSCAN_MENU_IF_NO_NEW_MSGS_OPT_NUM;
}
 
console.crlf();
......@@ -15270,10 +15300,7 @@ function DigDistMsgReader_DoUserSettings_Traditional()
printTradUserSettingOption(DISPLAY_PERSONAL_MAIL_REPLIED_INDICATOR_CHAR_OPT_NUM, "Display email replied indicator", wordFirstCharAttrs, wordRemainingAttrs);
// Newscan options
if (this.doingNewscan)
{
printTradUserSettingOption(SHOW_INDEXED_NEWSCAN_MENU_IF_NO_NEW_MSGS_OPT_NUM, "Show indexed menu if there are no new messages", wordFirstCharAttrs, wordRemainingAttrs);
printTradUserSettingOption(INDEXED_MODE_NEWSCAN_MENU_AFTER_READING_ALL_NEW_MSGS_OPT_INDEX, "Show indexed menu after reading all new messages", wordFirstCharAttrs, wordRemainingAttrs);
}
console.crlf();
console.print("\x01cYour choice (\x01hQ\x01n\x01c: Quit)\x01h: \x01g");
var userChoiceNum = console.getnum(HIGHEST_CHOICE_NUM);
......@@ -15305,11 +15332,6 @@ function DigDistMsgReader_DoUserSettings_Traditional()
this.userSettings.displayIndexedModeMenuIfNoNewMessages = !console.noyes("Show indexed menu if there are no new messages");
userSettingsChanged = (this.userSettings.displayIndexedModeMenuIfNoNewMessages != oldIndexedMenuIfNoMsgsSetting);
break;
case INDEXED_MODE_NEWSCAN_MENU_AFTER_READING_ALL_NEW_MSGS_OPT_INDEX:
var oldIndexedMenuAfterReadingAllNewMsgsSetting = this.userSettings.showIndexedNewscanMenuAfterReadingAllNewMsgs;
this.userSettings.showIndexedNewscanMenuAfterReadingAllNewMsgs = console.yesno("Show indexed menu after reading all new messages");
userSettingsChanged = (this.userSettings.showIndexedNewscanMenuAfterReadingAllNewMsgs != oldIndexedMenuAfterReadingAllNewMsgsSetting);
break;
case INDEX_NEWSCAN_ENTER_SHOWS_MSG_LIST_OPT_NUM:
var oldIndexedModeEnterShowsMsgListSetting = this.userSettings.enterFromIndexMenuShowsMsgList;
this.userSettings.enterFromIndexMenuShowsMsgList = !console.noyes("Index menu: Show message list with enter");
......@@ -15603,7 +15625,7 @@ function DigDistMsgReader_DoIndexedMode(pScanScope, pNewscanOnly)
console.putmsg(pReader.indexedModeHelpLine); // console.putmsg() can process @-codes, which we use for mouse click tracking
console.attributes = "N";
}
}, 2);
}, 3);
if (userSettingsRetObj.needWholeScreenRefresh)
{
drawMenu = true;
......@@ -15621,6 +15643,11 @@ function DigDistMsgReader_DoIndexedMode(pScanScope, pNewscanOnly)
else
this.DoUserSettings_Traditional();
}
// CTRL-S: Re-scan sub-boards
else if (indexRetObj.lastUserInput == this.indexedModeMenuKeys.reScanSubBoards)
{
drawMenu = true;
}
else
continueOn = false;
}
......@@ -15724,19 +15751,7 @@ function DigDistMsgReader_IndexedModeChooseSubBoard(pClearScreen, pDrawMenu, pDi
this.indexedModeMenu = this.CreateLightbarIndexedModeMenu(numMsgsWidth, numNewMsgsWidth, lastPostDateWidth, this.indexedModeItemDescWidth, this.indexedModeSubBoardMenuSubBoardFormatStr);
}
else
{
DigDistMsgReader_IndexedModeChooseSubBoard.selectedItemIdx = this.indexedModeMenu.selectedItemIdx;
/*
// Temporary
if (user.is_sysop)
{
console.print("\x01n\r\n");
console.print("Indexed menu item index: " + DigDistMsgReader_IndexedModeChooseSubBoard.selectedItemIdx + "\r\n");
console.pause();
}
// End Temporary
*/
}
// Ensure the menu is clear, and (re-)populate the menu with sub-board information w/ # of new messages in each, etc.
// Also, build an array of sub-board codes for each menu item.
this.indexedModeMenu.RemoveAllItems();
......@@ -15804,9 +15819,9 @@ function DigDistMsgReader_IndexedModeChooseSubBoard(pClearScreen, pDrawMenu, pDi
}
return retObj;
}
// For a newscan, if there are no new messages and the user setting to show the indexed menu when there are no new messages
// For a newscan, if this is the first function call and there are no new messages and the user setting to show the indexed menu when there are no new messages
// is disabled, then say so and return.
else if (thisFunctionFirstCall && totalNewMsgs == 0 && (!this.userSettings.displayIndexedModeMenuIfNoNewMessages || !this.userSettings.showIndexedNewscanMenuAfterReadingAllNewMsgs))
else if (thisFunctionFirstCall && totalNewMsgs == 0 && !this.userSettings.displayIndexedModeMenuIfNoNewMessages && !gCmdLineArgVals.newscanindexmenuafterreadallnew)
{
if (newScanOnly)
{
......@@ -15819,7 +15834,7 @@ function DigDistMsgReader_IndexedModeChooseSubBoard(pClearScreen, pDrawMenu, pDi
}
// For a newscan, if this is not the first time the indexed newscan menu is being displayed and there are no more new
// messages, and the user has the setting to show the indexed newscan menu now is disabled, then return.
else if (!thisFunctionFirstCall && totalNewMsgs == 0 && !this.userSettings.showIndexedNewscanMenuAfterReadingAllNewMsgs)
else if (!thisFunctionFirstCall && totalNewMsgs == 0 && !gCmdLineArgVals.newscanindexmenuafterreadallnew)
{
if (newScanOnly)
{
......@@ -15837,7 +15852,10 @@ function DigDistMsgReader_IndexedModeChooseSubBoard(pClearScreen, pDrawMenu, pDi
{
var savedItemIdx = DigDistMsgReader_IndexedModeChooseSubBoard.selectedItemIdx;
if (this.indexedModeSetIdxMnuIdxOneMore)
{
++savedItemIdx;
this.indexedModeSetIdxMnuIdxOneMore = false;
}
if (savedItemIdx >= 0 && savedItemIdx < this.indexedModeMenu.NumItems())
setIndexedSubBoardMenuSelectedItemIdx(this.indexedModeMenu, savedItemIdx);
else
......@@ -15933,30 +15951,114 @@ function DigDistMsgReader_IndexedModeChooseSubBoard(pClearScreen, pDrawMenu, pDi
});
menuItem.text = itemInfo.itemText;
this.indexedModeMenu.items[this.indexedModeMenu.selectedItemIdx] = menuItem;
this.indexedModeMenu.WriteItemAtItsLocation(this.indexedModeMenu.selectedItemIdx, true, false);
// Visually refresh the item on the menu
//if (usingANSI)
// this.indexedModeMenu.WriteItemAtItsLocation(this.indexedModeMenu.selectedItemIdx, true, false);
// If the user wants to (based on their settings), "snap" to the next sub-board with new messages if there
// is one
var newMsgsExistInOtherSubBoards = false; // Whether or not new messages exist in any other sub-boards
var fullNewMsgCheckEndIdx = this.indexedModeMenu.NumItems(); // For later: End index for full sub-board list new-message check
var originalSelectedSubBoardIdx = this.indexedModeMenu.selectedItemIdx;
if (this.userSettings.indexedModeMenuSnapToNextWithNewAftarMarkAllRead && this.indexedModeMenu.selectedItemIdx < this.indexedModeMenu.NumItems())
{
fullNewMsgCheckEndIdx = this.indexedModeMenu.selectedItemIdx; // For full sub-board list check later
var foundNextItem = false;
for (var i = this.indexedModeMenu.selectedItemIdx+1; i < this.indexedModeMenu.NumItems(); ++i)
{
var menuItem = this.indexedModeMenu.GetItem(i);
if (menuItem == null || typeof(menuItem) !== "object" || !menuItem.hasOwnProperty("retval"))
continue;
if (menuItem.hasOwnProperty("isSelectable") && menuItem.isSelectable && menuItem.retval.numNewMsgs > 0)
{
foundNextItem = true;
// If the new item is on the screen, then refresh the 2 items; and no need to refresh the whole menu
if (i >= this.indexedModeMenu.topItemIdx && i <= this.indexedModeMenu.GetBottomItemIdx() && usingANSI)
{
// Write the current item un-selected, and write the new item selected
this.indexedModeMenu.WriteItemAtItsLocation(this.indexedModeMenu.selectedItemIdx, false, false);
this.indexedModeMenu.WriteItemAtItsLocation(i, true, false);
drawMenu = false;
}
else
drawMenu = true;
this.indexedModeMenu.SetSelectedItemIdx(i);
DigDistMsgReader_IndexedModeChooseSubBoard.selectedItemIdx = i;
break;
}
}
// If another menu item wasn't found, then visually refresh the current one that was marked all read
if (!foundNextItem && usingANSI)
this.indexedModeMenu.WriteItemAtItsLocation(this.indexedModeMenu.selectedItemIdx, true, false);
// If no sub-board with new messages was found going forward, then start at the first and check
newMsgsExistInOtherSubBoards = foundNextItem;
if (!newMsgsExistInOtherSubBoards && originalSelectedSubBoardIdx > 0)
{
for (var i = 0; i < fullNewMsgCheckEndIdx && !newMsgsExistInOtherSubBoards; ++i)
{
var menuItem = this.indexedModeMenu.GetItem(i);
if (menuItem == null || typeof(menuItem) !== "object" || !menuItem.hasOwnProperty("retval"))
continue;
newMsgsExistInOtherSubBoards = (menuItem.hasOwnProperty("isSelectable") && menuItem.isSelectable && menuItem.retval.numNewMsgs > 0);
}
}
}
else
{
// Visually refresh the current sub-board on the menu that was marked all read
if (usingANSI)
{
this.indexedModeMenu.WriteItemAtItsLocation(this.indexedModeMenu.selectedItemIdx, true, false);
drawMenu = false;
}
else
drawMenu = true;
}
// If doing a newscan & the command-line indexed mode override is not specified, then if there are
// no more new messages in any of the sub-boards, exit he newscan.
if (newScanOnly && !gCmdLineArgVals.indexedmode && !newMsgsExistInOtherSubBoards)
{
console.attributes = "N";
if (usingANSI)
console.gotoxy(1, console.screen_rows);
console.crlf();
printf(bbs.text(MessageScanComplete), numSubBoards);
console.pause();
return retObj;
}
}
drawMenu = false; // No need to re-draw the whole menu
else
drawMenu = false;
}
// Things for the calling function to handle
// User settings dialog
else if (lastUserInputUpper == this.indexedModeMenuKeys.userSettings)
{
// The calling function will do the user settings dialog
continueOn = false;
retObj.lastUserInput = this.indexedModeMenuKeys.userSettings;
}
// Help screen for indexed mode
else if (lastUserInputUpper == this.indexedModeMenuKeys.help)
{
// The calling function will show the help screen and re-drawe
// the bottom help line below the menu
continueOn = false;
retObj.lastUserInput = this.indexedModeMenuKeys.help;
}
// Re-scan sub-boards
else if (lastUserInputUpper == this.indexedModeMenuKeys.reScanSubBoards)
{
continueOn = false;
retObj.lastUserInput = this.indexedModeMenuKeys.reScanSubBoards;
}
}
console.attributes = "N";
return retObj;
}
 
// Helper for DigDistMsgReader_IndexedModeChooseSubBoard(): Sets the selected item in the
// indexed mode sub-board menu and adjusts the menu items to be in a good location
// indexed mode sub-board menu and adjusts the menu items to be in a good location.
// This assumes the menu will be re-drawn afterward.
//
// Parameters:
// pIndexSubBoardMenu: The indexed sub-board menu
......@@ -15980,9 +16082,13 @@ function setIndexedSubBoardMenuSelectedItemIdx(pIndexSubBoardMenu, pSelectedItem
if (!selectedItemIsFirst && !selectedItemOnLastPage && moreThanOneScreenfulOfItems && !selectedItemIsOnFirstPage)
{
if (pIndexSubBoardMenu.selectedItemIdx > 0)
{
pIndexSubBoardMenu.topItemIdx = pIndexSubBoardMenu.selectedItemIdx - 1;
}
else
{
pIndexSubBoardMenu.topItemIdx = pIndexSubBoardMenu.selectedItemIdx;
}
}
}
}
......@@ -16126,9 +16232,10 @@ function DigDistMsgReader_ShowIndexedListHelp()
printf(formatStr2, "HOME", "F", "Go to the first item");
printf(formatStr2, "END", "L", "Go to the last item");
printf(formatStr, "ENTER", "Read the sub-board");
printf(formatStr, "R", "Mark all read");
printf(formatStr, "R", "Mark all read in the sub-board");
printf(formatStr, "M", "Show message list for the sub-board");
printf(formatStr, "Ctrl-U", "User settings");
printf(formatStr, "Ctrl-S", "Re-scan sub-boards");
printf(formatStr, "Q", "Quit");
//printf(formatStr, "?", "Show this help screen");
}
......@@ -19840,7 +19947,8 @@ function parseArgs(argv)
if ((argName == "chooseareafirst") || (argName == "personalemail") ||
(argName == "personalemailsent") || (argName == "allpersonalemail") ||
(argName == "verboselogging") || (argName == "suppresssearchtypetext") ||
(argName == "onlynewpersonalemail") || (argName == "indexedmode"))
(argName == "onlynewpersonalemail") || (argName == "indexedmode") ||
(argName == "newscanindexmenuafterreadallnew"))
{
argVals[argName] = true;
}
......@@ -20053,6 +20161,7 @@ function getDefaultArgParseObj()
verboselogging: false,
suppresssearchtypetext: false,
indexedmode: false,
newscanindexmenuafterreadallnew: false,
loadableModule: false,
exitNow: false
};
......@@ -24153,6 +24262,7 @@ function entryExistsInGlobalEmailFilter(pEmailAddr)
return entryExists;
}
 
///////////////////////////////////////////////////////////////////////////////////
 
// For debugging: Writes some text on the screen at a given location with a given pause.
......
......@@ -5,7 +5,7 @@
// If you have DDMsgReader in a directory other than xtrn/DDMsgReader, then the changes to
// DDMsgReader.cfg will be saved in that directory (assuming you're running ddmr_cfg.js from
// that same directory).
// Currently for DDMsgReader 1.94.
// Currently for DDMsgReader 1.94a.
//
// If you're running DDMsgReader from xtrn/DDMsgReader (the standard location) and you want
// to save the configuration file there (rather than sbbs/mods), you can use one of the
......@@ -18,7 +18,7 @@ require("sbbsdefs.js", "P_NONE");
require("uifcdefs.js", "UIFC_INMSG");
if (!uifc.init("DigDist. Message Reader 1.94 Configurator"))
if (!uifc.init("DigDist. Message Reader 1.94a Configurator"))
{
print("Failed to initialize uifc");
exit(1);
......@@ -113,6 +113,7 @@ function doMainMenu()
"useIndexedModeForNewscan", // Boolean
"displayIndexedModeMenuIfNoNewMessages", // Boolean
"indexedModeMenuSnapToFirstWithNew", // Boolean
"indexedModeMenuSnapToNextWithNewAftarMarkAllRead", // Boolean
"newscanOnlyShowNewMsgs", // Boolean
"promptDelPersonalEmailAfterReply", // Boolean
"themeFilename" // String
......@@ -145,6 +146,7 @@ function doMainMenu()
"Use Indexed Mode For Newscan",
"Display Indexed menu even with no new messages",
"Index menu: Snap to sub-boards w/ new messages",
"Index menu mark all read: Snap to subs w/ new msgs",
"During a newscan, only show new messages",
"Personal email: Prompt to delete after reply",
"Theme Filename"
......@@ -553,6 +555,10 @@ function getOptionHelpText()
optionHelpText["indexedModeMenuSnapToFirstWithNew"] += "sub-board with new messages upon displaying or returning to the indexed newscan ";
optionHelpText["indexedModeMenuSnapToFirstWithNew"] += "sub-board menu. This is a default for a user setting that users can toggle ";
optionHelpText["indexedModeMenuSnapToFirstWithNew"] += "for themselves";
optionHelpText["indexedModeMenuSnapToNextWithNewAftarMarkAllRead"] = "Index menu mark all read: Snap to subs w/ new msgs: For the indexed sub-board menu when doing a newscan, ";
optionHelpText["indexedModeMenuSnapToNextWithNewAftarMarkAllRead"] += "whether or not to 'snap' the lightbar selected item to the next sub-board with ";
optionHelpText["indexedModeMenuSnapToNextWithNewAftarMarkAllRead"] += "new messages when the user marks all messages as read in a sub-board on the menu";
optionHelpText["newscanOnlyShowNewMsgs"] = "During a newscan, only show new messages (default for a user setting): Whether or not ";
optionHelpText["newscanOnlyShowNewMsgs"] += "to only show new messages when the user is doing a newscan. Users can toggle this as ";
......@@ -756,6 +762,8 @@ function readDDMsgReaderCfgFile()
retObj.cfgOptions.newscanOnlyShowNewMsgs = true;
if (!retObj.cfgOptions.hasOwnProperty("indexedModeMenuSnapToFirstWithNew"))
retObj.cfgOptions.indexedModeMenuSnapToFirstWithNew = false;
if (!retObj.cfgOptions.hasOwnProperty("indexedModeMenuSnapToNextWithNewAftarMarkAllRead"))
retObj.cfgOptions.indexedModeMenuSnapToNextWithNewAftarMarkAllRead = true;
if (!retObj.cfgOptions.hasOwnProperty("promptDelPersonalEmailAfterReply"))
retObj.cfgOptions.promptDelPersonalEmailAfterReply = false;
if (!retObj.cfgOptions.hasOwnProperty("themeFilename"))
......
Digital Distortion Message Reader
Version 1.94
Release date: 2024-01-08
Version 1.95
Release date: 2024-01-20
by
......@@ -314,6 +314,8 @@ The following are the command-line parameters supported by DDMsgReader.js:
This is intended to work if it is the only command-line option.
-indexModeScope: Specifies the scope (set of sub-boards) for indexed reader mode
with -indexedMode. Valid values are "group" or "all".
-newscanIndexMenuAfterReadAllNew: Always display the indexed mode menu, even
during a newscan after the user has read all new messages
-search: A search type. Available options:
keyword_search: Do a keyword search in message subject/body text (current message area)
from_name_search: 'From' name search (current message area)
......@@ -461,6 +463,14 @@ prompting):
- Start in indexed reader mode for all sub-boards(without prompting):
?../xtrn/DDMsgReader/DDMsgReader.js -indexedMode -indexModeScope=all
- Start in indexed reader mode for all sub-boards (without prompting), and still
show the indexed mode menu when the user is done reading all messages:
?../xtrn/DDMsgReader/DDMsgReader.js -indexedMode -indexModeScope=all -newscanIndexMenuAfterReadAllNew
- Do a newscan for all-subobards, use the indexed mode menu, and continue displaying
the index mode menu after the user has read all new messages:
?../xtrn/DDMsgReader/DDMsgReader.js -search=new_msg_scan -indexedMode -indexModeScope=all -newscanIndexMenuAfterReadAllNew
- Text (keyword) search in the current sub-board, and list the messages found:
?../xtrn/DDMsgReader/DDMsgReader.js -search=keyword_search -startMode=list
......@@ -806,6 +816,15 @@ indexedModeMenuSnapToFirstWithNew For the indexed newscan sub-board menu in
menu. This is a default for a user setting
that users can toggle for themselves.
indexedModeMenuSnapToNextWithNewAftarMarkAllRead
For the indexed sub-board menu when doing
a newscan, whether or not to "snap" the
lightbar selected item to the next
sub-board with new messages when the user
marks all messages as read in a sub-board
on the menu. This is a default for a user
setting that users can toggle for
themselves.
promptDelPersonalEmailAfterReply Default for a user setting: When reading
personal email, whether or not to propmt
......
......@@ -5,6 +5,26 @@ Revision History (change log)
=============================
Version Date Description
------- ---- -----------
1.95 2024-01-20 Removed user option to display indexed mode menu in
newscan after all new messages are read.
Command-line option -indexedMode can now be specified with
-search=new_msg_scan to make it display the indexed mode
menu, regardless of the user setting to use the indexed
mode menu for a newscan.
New command-line option: -newscanIndexMenuAfterReadAllNew
This specifies to continue to display the indexed mode
menu after the user has read all new messages during a
newscan.
The following command-line can be used to do a newscan
for all sub-boards and continue displaying the index mode
menu after the user has read all new messages:
DDMsgReader.js -search=new_msg_scan -indexedMode -indexModeScope=all -newscanIndexMenuAfterReadAllNew
New indexed mode newscan behavior: R (mark all read) moves
to the next sub-board.
Ctrl-S in the indexed mode menu re-scans sub-boards (to
detect more new messages, etc.)
New DDMsgReader.cfg option for user config default:
indexedModeMenuSnapToNextWithNewAftarMarkAllRead
1.94 2024-01-07 Fix: For indexed read mode (not doing a newscan), when
choosing a sub-board to read, the correct (first unread)
message is displayed. Also, the user's scan pointer is
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment