From 473fe73fc034bd30c2baa2630f973e67018a3fe0 Mon Sep 17 00:00:00 2001 From: Darren Date: Wed, 18 Jul 2012 21:15:58 +0100 Subject: [PATCH] Auto panel scrolling; Sending raw IRC commands; Tab closing panels correctly; Panels closing upon part; --- client_backbone/img/redcross.png | Bin 0 -> 4154 bytes client_backbone/img/scroll_handle.png | Bin 0 -> 215 bytes client_backbone/model.js | 17 +++++++++ client_backbone/model_application.js | 13 +++++++ client_backbone/style.css | 7 ++-- client_backbone/view.js | 51 ++++++++++++++++++++------ 6 files changed, 74 insertions(+), 14 deletions(-) create mode 100644 client_backbone/img/redcross.png create mode 100644 client_backbone/img/scroll_handle.png diff --git a/client_backbone/img/redcross.png b/client_backbone/img/redcross.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f5fe0a69d02b8b52e8a6299885be555d44e399 GIT binary patch literal 4154 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw2(4w)elB@w}FfdWj%4dKI|^K-~-sHue<-iOJciB??KY z>6v-9O7C~?S5nAKu~iB;^)>Jbs{}UJ3djZt>nkaMm6T-LDnT3-;TxdfoL`ixV4`QFXQZ2KU}mgfYOH5$ zYGh_)qN8ABU|^wdV6Ja$plfJhWoTq&XrTZFN_JcdHbp6ERzWUqQ0ss^TcwPWk^(Dz z{qpj1y>er{{GxPyLrY6beFGzXBO_g)3fwM zQsi1ul9*Bi%LbV8&Y2~ZxMhQYB?mYS;4nQPIX?xMOd$yvi{T|jxC{?T%?Zyh0+u0I z^}6OJX5y0%ErQ8{6NC*oX(1H=z}SF@0SgvjnWhgf)S#&eTK>?A0*4l@42PLJY6&bP zh@wY>i>P3NDH;tfSV#~>j|LY}!30w@8eFiDAc`IhE~0`7rU+kfaUr@zsd>QmaXGNl zvw`ctTm}ZF37#&FAr-e`f?_=;Cra4fKX11^)9YcHR_?6LYX4NT>cu_pUg>@4S|MGs zbKRmmy-Y%1KW=8x=Sy_C0``f#hw@=;u;z04| zdBqjyf7`LUwA`qfIQL3;RmUE^nPun7(j3b!Ga0IsY5z@6On}oR@X`>Ww!pcg>u(%;Naoy;a>yZq|v+*J?R$%vF*aw z4w0kZR-2z#XQ*iPwAJuB)A<8BL4H>nUh8cMYF*3Kc(eb)Muw(Ea=W?vk{4x5Xe#j+ zm#Q9m%-q4n<sWIq_Ie*jV6J@uynIDLl#K*h8afOQG@+D5ek!=k}1mtEloG9#I zGhgsxvVr+FrqyqycHD4Im*L%VrG$UlrxJrtif6J9RM^fqF=34c2WJ$AprE~4_{744 zZGXJOckD21^UqVSd>`L#Y0qo*D0Fg%gGz_V)Nh#_#lf>RHeFSGzNokR<(D6Kyb)kJh ze6M6kNGO+%d)LMbH@h-_7TPQ-xHiS}w5)$XNZPSqCpfmvh!-`^@L<+lx}xJQi}0A=2cf2%;(BJ{qVhP(-EhR4w(??Y5UhVa>{JtW#iyzFx;wpE9Awh zzQiv#4R##-ruVDrr_Cl~mk&t{AF?-oh;CnVE2<-k(VPEP;;BEZu6GxjEov_Bb&rd+ zeY96PKT~b{Nrz@J<*jdxFH|qrzUbK>z3lnS%q!t@y!p?%N#*VlelFxXuWZN4iwVoh tv;6<-|D18!(R}l_%NgCa2mcBtFsxusjM&G#X%nb7@9FC2vd$@?2>|qN^F9Co literal 0 HcmV?d00001 diff --git a/client_backbone/img/scroll_handle.png b/client_backbone/img/scroll_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..a196e65e8287fa4e5c837071bfa76b660c1d5090 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTn0VEg_`c|+5DVB6cUq=Rpjs4tz5ovY3H^TM&d9>r>(<0tK0pyxmQcQFGsLJO>%d;OXk;vd$@?2>=abGY|j( literal 0 HcmV?d00001 diff --git a/client_backbone/model.js b/client_backbone/model.js index f767b3b..3a52344 100644 --- a/client_backbone/model.js +++ b/client_backbone/model.js @@ -227,6 +227,23 @@ kiwi.model.Panel = Backbone.Model.extend({ this.set({"scrollback": bs}, {silent: true}); this.trigger("msg", message_obj); + }, + + close: function () { + this.view.remove(); + delete this.view; + + var members = this.get('members'); + if (members) { + members.reset([]); + this.unset('members'); + } + + this.destroy(); + + if (this.cid === kiwi.current_panel.cid) { + kiwi.app.panels.server.view.show(); + } } }); diff --git a/client_backbone/model_application.js b/client_backbone/model_application.js index 1cd98d2..0eb1d28 100644 --- a/client_backbone/model_application.js +++ b/client_backbone/model_application.js @@ -80,6 +80,12 @@ kiwi.model.Application = Backbone.Model.extend(new (function () { channel = that.panels.getByName(event.channel); if (!channel) return; + // If this is us, close the panel + if (event.nick === kiwi.gateway.get('nick')) { + channel.close(); + return; + } + members = channel.get('members'); if (!members) return; @@ -163,6 +169,8 @@ kiwi.model.Application = Backbone.Model.extend(new (function () { * Bind to certain commands that may be typed into the control box */ this.bindControllboxCommands = function (controlbox) { + controlbox.on('unknown_command', this.unknownCommand); + controlbox.on('command', this.allCommands); controlbox.on('command_msg', this.msgCommand); @@ -183,6 +191,11 @@ kiwi.model.Application = Backbone.Model.extend(new (function () { }); }); }; + + this.unknownCommand = function (ev) { + kiwi.gateway.raw(ev.command + ' ' + ev.params.join(' ')); + }; + this.allCommands = function (ev) { console.log('allCommands', ev); }; diff --git a/client_backbone/style.css b/client_backbone/style.css index 3c7c8a0..3e4ab26 100644 --- a/client_backbone/style.css +++ b/client_backbone/style.css @@ -15,9 +15,9 @@ body { /** * Main layout blocks */ -#toolbar { border-bottom:1px solid red; position:absolute; top:0px; width:100%; background-color:#1B1B1B; font-size:0.9em; } -#panels { border:1px green solid; position:absolute; left:0px; right:200px; bottom:100px; top:100px; overflow-y:scroll; } -#memberlists { border:1px blue solid; position:absolute; right:0px; width:200px; bottom:100px; top:100px; } +#toolbar { position:absolute; top:0px; width:100%; background-color:#1B1B1B; font-size:0.9em; } +#panels { position:absolute; left:0px; right:200px; bottom:100px; top:100px; overflow-y:scroll; } +#memberlists { position:absolute; right:0px; width:200px; bottom:100px; top:100px; } #controlbox { position: absolute; bottom:0px; width:100%; background-color:#1B1B1B; } @@ -75,6 +75,7 @@ body { .messages { overflow-x:wrap; + overflow-y:scroll; border:none; display: none; height: 100%; } diff --git a/client_backbone/view.js b/client_backbone/view.js index a7172c9..695f22a 100644 --- a/client_backbone/view.js +++ b/client_backbone/view.js @@ -70,6 +70,10 @@ kiwi.view.Panel = Backbone.View.extend({ line_msg = '
<%- time %>
<%- nick %>
<%= msg %>
'; $this.append(_.template(line_msg, msg)); + // Scroll to the bottom of the channel + // TODO: Don't scroll down if we're scrolled up the channel a little + $this[0].scrollTop = $this[0].scrollHeight; + // Make sure our DOM isn't getting too large (Acts as scrollback) this.msg_count++; if (this.msg_count > 250) { @@ -102,6 +106,8 @@ kiwi.view.Panel = Backbone.View.extend({ } kiwi.current_panel = this.model; + + this.trigger('active', this.model); } }); @@ -117,17 +123,21 @@ kiwi.view.Channel = kiwi.view.Panel.extend({ } this.model.addMsg('', '=== Topic for ' + this.model.get('name') + ' is: ' + topic, 'topic'); - if ($(this.el).css('display') === 'block') { - // TODO: Update the active topic bar - //kiwi.front.ui.setTopicText(this.model.get("topic")); + + // If this is the active channel then update the topic bar + if (kiwi.current_panel === this) { + kiwi.app.setCurrentTopic(this.model.get("topic")); } } }); +// Model for this = kiwi.model.PanelList kiwi.view.Tabs = Backbone.View.extend({ events: { - "click li": "tabClick" + "click li": "tabClick", + 'click li img': 'partClick' }, + initialize: function () { this.model.on("add", this.panelAdded, this); this.model.on("remove", this.panelRemoved, this); @@ -144,7 +154,7 @@ kiwi.view.Tabs = Backbone.View.extend({ .appendTo($this); this.model.forEach(function (panel) { - // If this si the server panel, ignor as it's already added + // If this is the server panel, ignore as it's already added if (panel == that.model.server) return; $('
  • ' + panel.get("name") + '
  • ') @@ -154,27 +164,40 @@ kiwi.view.Tabs = Backbone.View.extend({ }, panelAdded: function (panel) { + // Add a tab to the panel panel.tab = $('
  • ' + panel.get("name") + '
  • '); panel.tab.data('panel_id', panel.cid) .appendTo(this.$el); + + panel.view.on('active', this.panelActive, this); }, panelRemoved: function (panel) { - $(panel.tab).remove(); - panel.view.remove(); - panel.destroy(); + panel.tab.remove(); + delete panel.tab; }, - tabClick: function (e) { + panelActive: function (panel) { + // Remove any existing tabs or part images + $('img', this.$el).remove(); this.$el.children().removeClass('active'); + panel.tab.addClass('active'); + panel.tab.append(''); + }, + + tabClick: function (e) { var panel = this.model.getByCid($(e.currentTarget).data('panel_id')); if (!panel) { // A panel wasn't found for this tab... wadda fuck return; } - panel.tab.addClass('active'); panel.view.show(); + }, + + partClick: function (e) { + var panel = this.model.getByCid($(e.currentTarget).parent().data('panel_id')); + kiwi.gateway.part(panel.get('name')); } }); @@ -219,7 +242,7 @@ kiwi.view.ControlBox = Backbone.View.extend({ } break; - case (ev.keyCode === 40): + case (ev.keyCode === 40): // down if (this.buffer_pos < this.buffer.length) { this.buffer_pos++; inp.val(this.buffer[this.buffer_pos]); @@ -243,6 +266,12 @@ kiwi.view.ControlBox = Backbone.View.extend({ // Trigger the command events this.trigger('command', {command: command, params: params}); this.trigger('command_' + command, {command: command, params: params}); + + // If we didn't have any listeners for this event, fire a special case + // TODO: This feels dirty. Should this really be done..? + if (!this._callbacks['command' + command]) { + this.trigger('unknown_command', {command: command, params: params}); + } } }); -- 2.25.1