diff --git a/core/fse.js b/core/fse.js index 42e221f6..b01cfcae 100644 --- a/core/fse.js +++ b/core/fse.js @@ -195,10 +195,9 @@ function FullScreenEditorModule(options) { }; if(self.isReply()) { - msgOpts.replyToMsgId = self.replyToMessageId; + msgOpts.replyToMsgId = self.replyToMessage.messageId; } - self.message = new Message(msgOpts); }; @@ -218,12 +217,29 @@ function FullScreenEditorModule(options) { }; - this.getMessage = function() { - if(self.isEditMode()) { - self.buildMessage(); - } + this.getMessage = function(cb) { + async.series( + [ + function buildIfNecessary(callback) { + if(self.isEditMode()) { + self.buildMessage(); // creates initial self.message + } + callback(null); + }, + function populateLocalUserInfo(callback) { + if(self.isLocalEmail()) { + msg.setLocalFromUserId(self.client.user.userId); + msg.setLocalToUserId(self.toUserId); + } - return self.message; + // :TODO: DO THAT! + callback(null); + } + ], + function complete(err) { + cb(err, self.message); + } + ); }; this.redrawFooter = function(options, cb) { @@ -720,7 +736,6 @@ function FullScreenEditorModule(options) { } this.menuMethods = { - // :TODO: rename to editModeHeaderSubmit headerSubmit : function(formData, extraArgs) { self.switchToBody(); }, @@ -735,7 +750,8 @@ function FullScreenEditorModule(options) { switch(self.footerMode) { case 'editor' : if(!_.isUndefined(self.viewControllers.footerEditorMenu)) { - self.viewControllers.footerEditorMenu.setFocus(false); + //self.viewControllers.footerEditorMenu.setFocus(false); + self.viewControllers.footerEditorMenu.detachClientEvents(); } self.viewControllers.body.switchFocus(1); self.observeEditorEvents(); @@ -782,14 +798,11 @@ function FullScreenEditorModule(options) { var quoteMsgView = self.viewControllers.quoteBuilder.getView(1); var msgView = self.viewControllers.body.getView(1); - //msgView.addText(_.trim(quoteMsgView.getData(), '\n')); - //msgView.addText(new Array(msgView.dimens.width - 1).join('-') + '\n'); msgView.addText(quoteMsgView.getData() + '\n'); quoteMsgView.setText(''); var footerName = self.getFooterName(); - - //self.redrawFooter( { clear : true, footerName : footerName }, function footerDisplayed(err) { + self.footerMode = 'editor'; self.switchFooter(function switched(err) { diff --git a/core/ftn_util.js b/core/ftn_util.js index baf5668f..88c6b5c9 100644 --- a/core/ftn_util.js +++ b/core/ftn_util.js @@ -10,10 +10,13 @@ var binary = require('binary'); var fs = require('fs'); var util = require('util'); +// :TODO: Remove "Ftn" from most of these -- it's implied in the module exports.stringFromFTN = stringFromFTN; exports.getFormattedFTNAddress = getFormattedFTNAddress; exports.getDateFromFtnDateTime = getDateFromFtnDateTime; +exports.getQuotePrefix = getQuotePrefix; + // See list here: https://github.com/Mithgol/node-fidonet-jam // :TODO: proably move this elsewhere as a general method @@ -81,6 +84,12 @@ function getFTNMessageID(messageId, areaId) { return messageId + '.' + areaId + '@' + getFTNAddress() + ' ' + getFTNMessageSerialNumber(messageId) } +// Get a FSC-0032 style quote prefixes +function getQuotePrefix(name) { + // :TODO: Add support for real names (e.g. with spaces) -> initials + return ' ' + name[0].toUpperCase() + name[1].toLowerCase() + '> '; +} + // // Specs: diff --git a/core/message.js b/core/message.js index f2f14e27..ef2b6060 100644 --- a/core/message.js +++ b/core/message.js @@ -3,6 +3,7 @@ var msgDb = require('./database.js').dbs.message; var wordWrapText = require('./word_wrap.js').wordWrapText; +var ftnUtil = require('./ftn_util.js'); var uuid = require('node-uuid'); var async = require('async'); @@ -244,19 +245,10 @@ Message.prototype.persist = function(cb) { ); }; -// :TODO: Update this to use a FTN module, e.g. ftn.getQuotePrefix(name) Message.prototype.getFTNQuotePrefix = function(source) { source = source || 'fromUserName'; - switch(source) { - case 'fromUserName' : - return this.fromUserName[0].toUpperCase() + this.fromUserName[1].toLowerCase(); - - case 'toUserName' : - return this.toUserName[0].toUpperCase() + this.toUserName[1].toLowerCase(); - - // :TODO: real names - } + return ftnUtil.getQuotePrefix(this[source]); }; Message.prototype.getQuoteLines = function(width, options) { @@ -282,7 +274,7 @@ Message.prototype.getQuoteLines = function(width, options) { var quotePrefix = ''; // we need this init even if blank if(options.includePrefix) { - quotePrefix = ' ' + this.getFTNQuotePrefix(options.prefixSource || 'fromUserName') + '> '; + quotePrefix = this.getFTNQuotePrefix(options.prefixSource || 'fromUserName'); } var wrapOpts = { diff --git a/core/vertical_menu_view.js b/core/vertical_menu_view.js index cbcac6a4..44b678bd 100644 --- a/core/vertical_menu_view.js +++ b/core/vertical_menu_view.js @@ -149,53 +149,11 @@ VerticalMenuView.prototype.setFocus = function(focused) { VerticalMenuView.prototype.onKeyPress = function(ch, key) { if(key) { - var prevFocusedItemIndex = this.focusedItemIndex; - if(this.isKeyMapped('up', key.name)) { this.focusPrevious(); - /* - if(0 === this.focusedItemIndex) { - this.focusedItemIndex = this.items.length - 1; - - this.viewWindow = { - //top : this.items.length - this.maxVisibleItems, - top : Math.max(this.items.length - this.maxVisibleItems, 0), - bottom : this.items.length - 1 - }; - - } else { - this.focusedItemIndex--; - - if(this.focusedItemIndex < this.viewWindow.top) { - this.viewWindow.top--; - this.viewWindow.bottom--; - } - } - */ } else if(this.isKeyMapped('down', key.name)) { - /*if(this.items.length - 1 === this.focusedItemIndex) { - this.focusedItemIndex = 0; - - this.viewWindow = { - top : 0, - bottom : Math.min(this.focusedItemIndex + this.maxVisibleItems, this.items.length) - 1 - }; - } else { - this.focusedItemIndex++; - - if(this.focusedItemIndex > this.viewWindow.bottom) { - this.viewWindow.top++; - this.viewWindow.bottom++; - } - } - */ this.focusNext(); } - - if(prevFocusedItemIndex !== this.focusedItemIndex) { - // :TODO: Optimize this for cases where no scrolling occured & only two items need updated - // this.redraw(); - } } VerticalMenuView.super_.prototype.onKeyPress.call(this, ch, key); @@ -211,6 +169,7 @@ VerticalMenuView.prototype.setItems = function(items) { this.positionCacheExpired = true; }; +// :TODO: Apply draw optimizaitons when only two items need drawn vs entire view! VerticalMenuView.prototype.focusNext = function() { VerticalMenuView.super_.prototype.focusNext.call(this); diff --git a/core/view.js b/core/view.js index 90499d01..c8565f4e 100644 --- a/core/view.js +++ b/core/view.js @@ -247,6 +247,9 @@ View.prototype.setFocus = function(focused) { }; View.prototype.onKeyPress = function(ch, key) { + if(false === this.hasFocus) { + console.log('doh!'); + } assert(this.hasFocus, 'View does not have focus'); assert(this.acceptsInput, 'View does not accept input'); diff --git a/core/view_controller.js b/core/view_controller.js index b6ae89bf..d5d7d48f 100644 --- a/core/view_controller.js +++ b/core/view_controller.js @@ -57,11 +57,11 @@ function ViewController(options) { { ch : ch, key : key }, // formData actionForKey); // action block } + } else { + if(self.focusedView && self.focusedView.acceptsInput) { + self.focusedView.onKeyPress(ch, key); + } } - - if(self.focusedView && self.focusedView.acceptsInput) { - self.focusedView.onKeyPress(ch, key); - } }; this.viewActionListener = function(action, key) { @@ -373,12 +373,12 @@ ViewController.prototype.setFocus = function(focused) { this.detachClientEvents(); } - // :TODO: without this, setFocus(false) is broken (doens't call focus events); with it, FSE menus break!! -// this.setViewFocusWithEvents(this.focusedView, focused); + this.setViewFocusWithEvents(this.focusedView, focused); }; ViewController.prototype.switchFocus = function(id) { - this.setFocus(true); // ensure events are attached + //this.setFocus(true); // ensure events are attached + this.attachClientEvents(); // remove from old this.setViewFocusWithEvents(this.focusedView, false); diff --git a/mods/menu.hjson b/mods/menu.hjson index 1d1804c6..70efce55 100644 --- a/mods/menu.hjson +++ b/mods/menu.hjson @@ -774,6 +774,7 @@ width: 27 argName: to focus: true + text: All } "ET3" : { "width" : 27, @@ -855,10 +856,14 @@ } ] }, - "actionKeys" : [ // :TODO: Need better name + actionKeys: [ // :TODO: Need better name { - "keys" : [ "escape" ], - "action" : "@method:editModeEscPressed" + keys: [ "escape" ] + action: @method:editModeEscPressed + } + { + keys: [ "?" ] + action: @method:editModeMenuHelp } ] // :TODO: something like the following for overriding keymap diff --git a/mods/msg_area_post_fse.js b/mods/msg_area_post_fse.js index b1b5e6c6..a8acc693 100644 --- a/mods/msg_area_post_fse.js +++ b/mods/msg_area_post_fse.js @@ -25,17 +25,15 @@ function AreaPostFSEModule(options) { this.editorMode = 'edit'; this.menuMethods.editModeMenuSave = function(formData, extraArgs) { - var msg = self.getMessage(); + var msg; async.series( [ - function prepareMessage(callback) { - if(self.isLocalEmail()) { - msg.setLocalFromUserId(self.client.user.userId); - msg.setLocalToUserId(self.toUserId); - } - - callback(null); + function getMessageObject(callback) { + self.getMessage(function gotMsg(err, msgObj) { + msg = msgObj; + callback(err); + }); }, function saveMessage(callback) { msg.persist(function persisted(err) {