]> jfr.im git - irc/quakenet/qwebirc.git/blobdiff - js/ui/baseui.js
Bump to 1.00
[irc/quakenet/qwebirc.git] / js / ui / baseui.js
index 0d9ec12488ac0046251a4502727b11e5957c956f..86145c9eb020b9fe837b2f70fb65bc92aaecdb47 100644 (file)
@@ -6,6 +6,7 @@ qwebirc.ui.WINDOW_CONNECT =  0x10;
 qwebirc.ui.WINDOW_MESSAGES = 0x20;
 
 qwebirc.ui.CUSTOM_CLIENT = "custom";
+qwebirc.ui.DEFAULT_HUE = 210; /* nice blue */
 
 qwebirc.ui.BaseUI = new Class({
   Implements: [Events],
@@ -47,11 +48,20 @@ qwebirc.ui.BaseUI = new Class({
       document.addEvent("focus", focus);
       window.addEvent("focus", focus);
     }
+
+    qwebirc.util.__log = function(x) {
+      if(QWEBIRC_DEBUG) {
+        if(typeof console != "undefined")
+          console.log(x);
+        this.getActiveWindow().addLine(null, x);
+      }
+    }.bind(this);
   },
   newClient: function(client) {
     client.id = String(this.clientId++);
     client.hilightController = new qwebirc.ui.HilightController(client);
     client.addEvent("signedOn", function() {
+      this.poller = new qwebirc.xdomain.Poller(this.oobMessage.bind(this));
       this.fireEvent("signedOn", client);
     }.bind(this));
     this.windows.put(client.id, new QHash());
@@ -61,7 +71,7 @@ qwebirc.ui.BaseUI = new Class({
     if(!this.firstClient) {
       this.firstClient = true;
       w.addLine("", "qwebirc v" + qwebirc.VERSION);
-      w.addLine("", "Copyright (C) 2008-2014 Chris Porter and the qwebirc project.");
+      w.addLine("", "Copyright (C) 2008-2017 Chris Porter and the qwebirc project.");
       w.addLine("", "http://www.qwebirc.org");
       w.addLine("", "Licensed under the GNU General Public License, Version 2.");
     }
@@ -102,7 +112,7 @@ qwebirc.ui.BaseUI = new Class({
     if(!$defined(c))
       return null;
       
-    return c[this.getWindowIdentifier(client, type, name)];
+    return c.get(this.getWindowIdentifier(client, type, name));
   },
   getActiveWindow: function() {
     return this.active;
@@ -200,12 +210,40 @@ qwebirc.ui.BaseUI = new Class({
       tricked into getting themselves glined
     */
   loginBox: function(callback, initialNickname, initialChannels, autoConnect, autoNick) {
-    qwebirc.ui.GenericLoginBox(this.parentElement, callback, initialNickname, initialChannels, autoConnect, autoNick, this.options.networkName);
+    this.postInitialize();
+
+    this.addCustomWindow("Connect", qwebirc.ui.ConnectPane, "connectpane", {
+      initialNickname: initialNickname, initialChannels: initialChannels, autoConnect: autoConnect, callback: callback, autoNick: autoNick,
+      uiOptions: this.options
+    }, qwebirc.ui.WINDOW_CONNECT);
   },
   focusChange: function(newValue) {
     var window_ = this.getActiveWindow();
     if($defined(window_))
       window_.focusChange(newValue);
+  },
+  oobMessage: function(message) {
+    var c = message.splitMax(" ", 2);
+    if(c.length != 2)
+      return;
+
+    var command = c[0];
+    if(command != "CMD")
+      return;
+
+    var d = c[1].splitMax(" ", 2);
+    if(d.length != 2)
+      return;
+
+    var command = d[0];
+    var args = d[1];
+    if(command == "SAY") {
+      var w = this.getActiveIRCWindow();
+      if($defined(w) && (w.type == qwebirc.ui.WINDOW_CHANNEL || w.type == qwebirc.ui.WINDOW_QUERY)) {
+        w.client.exec("/SAY " + args);
+        return;
+      }
+    }
   }
 });
 
@@ -215,26 +253,35 @@ qwebirc.ui.StandardUI = new Class({
   initialize: function(parentElement, windowClass, uiName, options) {
     this.parent(parentElement, windowClass, uiName, options);
 
+    this.__styleValues = {hue: qwebirc.ui.DEFAULT_HUE, saturation: 0, lightness: 0, textHue: null, textSaturation: null, textLightness: null};
+    if($defined(this.options.hue)) this.__styleValues.hue = this.options.hue;
     this.tabCompleter = new qwebirc.ui.TabCompleterFactory(this);
     this.uiOptions = new qwebirc.ui.DefaultOptionsClass(this, options.uiOptionsArg);
     this.customWindows = new QHash();
-    
-    this.__styleValues = {hue: this.uiOptions.STYLE_HUE, saturation: 0, lightness: 0, textHue: this.uiOptions.STYLE_HUE, textSaturation: 0, textLightness: 0};
-    if($defined(this.options.hue)) this.__styleValues.hue = this.options.hue;
+
     if($defined(this.options.saturation)) this.__styleValues.saturation = this.options.saturation;
     if($defined(this.options.lightness)) this.__styleValues.lightness = this.options.lightness;
-    if($defined(this.options.thue)) this.__styleValues.textHue = this.options.thue;
     if($defined(this.options.tsaturation)) this.__styleValues.textSaturation = this.options.tsaturation;
     if($defined(this.options.tlightness)) this.__styleValues.textLightness = this.options.tlightness;
-    
+
+    if($defined(this.options.hue)) { /* overridden in url */
+      /* ugh... this will go away when we add proper options for hue/sat/light for text and background */
+      this.uiOptions.setValueByPrefix("STYLE_HUE", this.__styleValues.hue);
+    } else {
+      this.__styleValues.hue = this.uiOptions.STYLE_HUE; /* otherwise copy from serialised store */
+    }
+    this.__styleValues.textHue = $defined(this.options.thue) ? this.options.thue : this.__styleValues.hue;
+
     document.addEvent("keydown", this.__handleHotkey.bind(this));
   },
   __handleHotkey: function(x) {
     var success = false;
-    if(!x.alt || x.control) {
+    if(!x.alt && !x.control && !x.shift && !x.meta) {
       if((x.key == "backspace" || x.key == "/") && !this.getInputFocused(x)) {
         success = true;
       }
+    } else if(!x.alt || x.control || x.meta) {
+      /* do nothing */
     } else if(x.key == "a" || x.key == "A") {
       var highestNum = 0;
       var highestIndex = -1;
@@ -249,7 +296,7 @@ qwebirc.ui.StandardUI = new Class({
       }
       if(highestIndex > -1)
         this.selectWindow(this.windowArray[highestIndex]);
-    } else if(x.key >= '0' && x.key <= '9') {
+    } else if((x.key >= '0' && x.key <= '9') && !x.shift) {
       success = true;
       
       number = x.key - '0';
@@ -262,13 +309,14 @@ qwebirc.ui.StandardUI = new Class({
         return;
         
       this.selectWindow(this.windowArray[number]);
-    } else if(x.key == "left") {
+    } else if((x.key == "left" || x.key == "up") && !x.shift) {
       this.prevWindow();
       success = true;
-    } else if(x.key == "right") {
+    } else if((x.key == "right" || x.key == "down") && !x.shift) {
       this.nextWindow();
       success = true;
     }
+
     if(success) {
       new Event(x).stop();
       x.preventDefault();
@@ -282,7 +330,7 @@ qwebirc.ui.StandardUI = new Class({
   newCustomWindow: function(name, select, type) {
     if(!type)
       type = qwebirc.ui.WINDOW_CUSTOM;
-      
+
     var w = this.newWindow(qwebirc.ui.CUSTOM_CLIENT, type, name);
     w.addEvent("close", function(w) {
       this.windows.get(qwebirc.ui.CUSTOM_CLIENT).remove(w.identifier);
@@ -293,7 +341,7 @@ qwebirc.ui.StandardUI = new Class({
 
     return w;
   },
-  addCustomWindow: function(windowName, class_, cssClass, options) {
+  addCustomWindow: function(windowName, class_, cssClass, options, type) {
     if(!$defined(options))
       options = {};
       
@@ -302,7 +350,7 @@ qwebirc.ui.StandardUI = new Class({
       return;
     }
     
-    var d = this.newCustomWindow(windowName, true);
+    var d = this.newCustomWindow(windowName, true, type);
     this.customWindows.put(windowName, d);
     
     d.addEvent("close", function() {
@@ -359,29 +407,30 @@ qwebirc.ui.StandardUI = new Class({
 
     return null;
   },
-  tabComplete: function(element) {
-    this.tabCompleter.tabComplete(element);
+  tabComplete: function(element, backwards) {
+    this.tabCompleter.tabComplete(element, backwards);
   },
   resetTabComplete: function() {
     this.tabCompleter.reset();
   },
   setModifiableStylesheet: function(name) {
-    this.__styleSheet = new qwebirc.ui.style.ModifiableStylesheet(qwebirc.global.staticBaseURL + "css/" + name + qwebirc.FILE_SUFFIX + ".mcss");
+    this.__styleSheet = new qwebirc.ui.style.ModifiableStylesheet(qwebirc.global.staticBaseURL + "css/" + (QWEBIRC_DEBUG ? "debug/" : "") + name + qwebirc.FILE_SUFFIX + ".mcss");
     this.setModifiableStylesheetValues({});
   },
   setModifiableStylesheetValues: function(values) {
-    for(var k in values)
+    for (var k in values)
       this.__styleValues[k] = values[k];
-      
-    if(!$defined(this.__styleSheet))
+
+    if (!$defined(this.__styleSheet))
       return;
-      
-    var back = {hue: this.__styleValues.hue, lightness: this.__styleValues.lightness, saturation: this.__styleValues.saturation};
-    var front = {hue: this.__styleValues.textHue, lightness: this.__styleValues.textLightness, saturation: this.__styleValues.textSaturation};
 
-    if(!this.__styleValues.textHue && !this.__styleValues.textLightness && !this.__styleValues.textSaturation)
+    var back = {hue: this.__styleValues.hue, lightness: this.__styleValues.lightness, saturation: this.__styleValues.saturation};
+    var front;
+    if (!$defined(this.__styleValues.textHue) && !$defined(this.__styleValues.textLightness) && !$defined(this.__styleValues.textSaturation)) {
       front = back;
-
+    } else {
+      front = {hue: Number(this.__styleValues.textHue), lightness: Number(this.__styleValues.textLightness), saturation: Number(this.__styleValues.textSaturation)}
+    }
     var colours = {
       back: back,
       front: front
@@ -441,28 +490,13 @@ qwebirc.ui.NotificationUI = new Class({
   }
 });
 
-qwebirc.ui.NewLoginUI = new Class({
-  Extends: qwebirc.ui.NotificationUI,
-  loginBox: function(callbackfn, initialNickname, initialChannels, autoConnect, autoNick) {
-    this.postInitialize();
-
-    /* I'd prefer something shorter and snappier! */
-    var w = this.newCustomWindow("Connect", true, qwebirc.ui.WINDOW_CONNECT);
-    var callback = function(args) {
-      w.close();
-      callbackfn(args);
-    };
-    
-    qwebirc.ui.GenericLoginBox(w.lines, callback, initialNickname, initialChannels, autoConnect, autoNick, this.options.networkName);
-  }
-});
-
 qwebirc.ui.QuakeNetUI = new Class({
-  Extends: qwebirc.ui.NewLoginUI,
+  Extends: qwebirc.ui.NotificationUI,
   urlDispatcher: function(name, window) {
     if(name == "qwhois") {
       return ["span", function(auth) {
-        this.client.exec("/MSG Q whois #" + auth);
+        if($defined(this.parentObject.options.accountWhoisCommand))
+          this.client.exec(this.parentObject.options.accountWhoisCommand + auth);
       }.bind(window)];
     }
     return this.parent(name, window);