]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch '0.8.x' into userdesign
authorZach Copley <zach@controlyourself.ca>
Tue, 16 Jun 2009 04:24:22 +0000 (21:24 -0700)
committerZach Copley <zach@controlyourself.ca>
Tue, 16 Jun 2009 04:24:22 +0000 (21:24 -0700)
* 0.8.x:
  a little better query handling in redirect code
  a little better query handling in redirect code
  forgot some functions aren't available at status time
  redirect on non-canonical server name
  don't show create-a-group link if not logged in
  allow a configured base for cache keys
  Missing call to getProfile() caused verify_credentials to fail.
  change mods for setup script
  Script to set up new status networks
  strncmp -> strcasecmp
  Return network from network setup function
  Configurable avatar directory

21 files changed:
actions/designsettings.php
actions/invite.php
actions/replies.php
actions/usergroups.php
classes/Design.php [new file with mode: 0644]
classes/User.php
classes/laconica.ini [changed mode: 0644->0755]
db/laconica.sql
js/farbtastic/farbtastic.go.js
lib/attachmentlist.php
lib/common.php
lib/currentuserdesignaction.php [new file with mode: 0644]
lib/galleryaction.php
lib/mailbox.php
lib/noticelist.php
lib/ownerdesignaction.php [new file with mode: 0644]
lib/personal.php [deleted file]
lib/profileaction.php
lib/settingsaction.php
lib/stream.php [deleted file]
lib/webcolor.php [new file with mode: 0644]

index 5774b85378d9e14025ef9a1c229083a48c13e200..b7f9cda987469569215866994f77c7e6446a2894 100644 (file)
@@ -22,6 +22,7 @@
  * @category  Settings
  * @package   Laconica
  * @author    Sarven Capadisli <csarven@controlyourself.ca>
+ * @author    Zach Copley <zach@controlyourself.ca>
  * @copyright 2008-2009 Control Yourself, Inc.
  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
  * @link      http://laconi.ca/
@@ -31,9 +32,8 @@ if (!defined('LACONICA')) {
     exit(1);
 }
 
-require_once INSTALLDIR.'/lib/accountsettingsaction.php';
-
-
+require_once INSTALLDIR . '/lib/accountsettingsaction.php';
+require_once INSTALLDIR . '/lib/webcolor.php';
 
 class DesignsettingsAction extends AccountSettingsAction
 {
@@ -82,7 +82,7 @@ class DesignsettingsAction extends AccountSettingsAction
         $this->element('legend', null, _('Change background image'));
         $this->elementStart('ul', 'form_data');
         $this->elementStart('li');
-        $this->element('label', array('for' => 'design_background-image_file'), 
+        $this->element('label', array('for' => 'design_background-image_file'),
                                 _('Upload file'));
         $this->element('input', array('name' => 'design_background-image_file',
                                       'type' => 'file',
@@ -100,61 +100,100 @@ class DesignsettingsAction extends AccountSettingsAction
         $this->element('legend', null, _('Change colours'));
         $this->elementStart('ul', 'form_data');
 
-        //This is a JSON object in the DB field. Here for testing. Remove later.
-        $userSwatch = '{"body":{"background-color":"#F0F2F5"},
-                        "#content":{"background-color":"#FFFFFF"},
-                        "#aside_primary":{"background-color":"#CEE1E9"},
-                        "html body":{"color":"#000000"},
-                        "a":{"color":"#002E6E"}}';
-
-        //Default theme swatch -- Where should this be stored?
-        $defaultSwatch = array('body' => array('background-color' => '#F0F2F5'),
-                               '#content' => array('background-color' => '#FFFFFF'),
-                               '#aside_primary' => array('background-color' => '#CEE1E9'),
-                               'html body' => array('color' => '#000000'),
-                               'a' => array('color' => '#002E6E'));
-
-        $userSwatch = ($userSwatch) ? json_decode($userSwatch, true) : $defaultSwatch;
-
-        $s = 0;
-        $labelSwatch = array('Background',
-                             'Content',
-                             'Sidebar',
-                             'Text',
-                             'Links');
-        foreach($userSwatch as $propertyvalue => $value) {
-            $foo = array_values($value);
+        $design = $user->getDesign();
+
+        if (empty($design)) {
+            $design = $this->defaultDesign();
+        }
+
+        try {
+
+            $bgcolor = new WebColor($design->backgroundcolor);
+
             $this->elementStart('li');
-            $this->element('label', array('for' => 'swatch-'.$s), _($labelSwatch[$s]));
-            $this->element('input', array('name' => 'swatch-'.$s, //prefer swatch[$s] ?
+            $this->element('label', array('for' => 'swatch-1'), _('Background'));
+            $this->element('input', array('name' => 'design_background',
                                           'type' => 'text',
-                                          'id' => 'swatch-'.$s,
+                                          'id' => 'swatch-1',
                                           'class' => 'swatch',
                                           'maxlength' => '7',
                                           'size' => '7',
-                                          'value' => $foo[0]));
+                                          'value' => '#' . $bgcolor->hexValue()));
             $this->elementEnd('li');
-            $s++;
-        }
 
-        $this->elementEnd('ul');
-        $this->elementEnd('fieldset');
 
-        $this->element('input', array('id' => 'settings_design_reset',
-                                      'type' => 'reset',
-                                      'value' => 'Reset',
-                                      'class' => 'submit form_action-primary',
-                                      'title' => _('Reset back to default')));
-        $this->submit('save', _('Save'), 'submit form_action-secondary', 'save', _('Save design'));
-
-/*TODO: Check submitted form values: 
-json_encode(form values)
-if submitted Swatch == DefaultSwatch, don't store in DB.
-else store in BD
-*/
+            $ccolor = new WebColor($design->contentcolor);
+
+            $this->elementStart('li');
+            $this->element('label', array('for' => 'swatch-2'), _('Content'));
+            $this->element('input', array('name' => 'design_content',
+                                          'type' => 'text',
+                                          'id' => 'swatch-2',
+                                          'class' => 'swatch',
+                                          'maxlength' => '7',
+                                          'size' => '7',
+                                          'value' => '#' . $ccolor->hexValue()));
+            $this->elementEnd('li');
+
+            $sbcolor = new WebColor($design->sidebarcolor);
+
+            $this->elementStart('li');
+            $this->element('label', array('for' => 'swatch-3'), _('Sidebar'));
+            $this->element('input', array('name' => 'design_sidebar',
+                                        'type' => 'text',
+                                        'id' => 'swatch-3',
+                                        'class' => 'swatch',
+                                        'maxlength' => '7',
+                                        'size' => '7',
+                                        'value' => '#' . $sbcolor->hexValue()));
+            $this->elementEnd('li');
+
+            $tcolor = new WebColor($design->textcolor);
+
+            $this->elementStart('li');
+            $this->element('label', array('for' => 'swatch-4'), _('Text'));
+            $this->element('input', array('name' => 'design_text',
+                                        'type' => 'text',
+                                        'id' => 'swatch-4',
+                                        'class' => 'swatch',
+                                        'maxlength' => '7',
+                                        'size' => '7',
+                                        'value' => '#' . $tcolor->hexValue()));
+            $this->elementEnd('li');
+
+            $lcolor = new WebColor($design->linkcolor);
+
+            $this->elementStart('li');
+            $this->element('label', array('for' => 'swatch-5'), _('Links'));
+            $this->element('input', array('name' => 'design_links',
+                                         'type' => 'text',
+                                         'id' => 'swatch-5',
+                                         'class' => 'swatch',
+                                         'maxlength' => '7',
+                                         'size' => '7',
+                                         'value' => '#' . $lcolor->hexValue()));
+
+           $this->elementEnd('li');
+
+       } catch (WebColorException $e) {
+           common_log(LOG_ERR, 'Bad color values in design ID: ' .
+               $design->id);
+       }
+
+       $this->elementEnd('ul');
+       $this->elementEnd('fieldset');
+
+       $this->element('input', array('id' => 'settings_design_reset',
+                                     'type' => 'reset',
+                                     'value' => 'Reset',
+                                     'class' => 'submit form_action-primary',
+                                     'title' => _('Reset back to default')));
+
+        $this->submit('save', _('Save'), 'submit form_action-secondary',
+            'save', _('Save design'));
+
         $this->elementEnd('fieldset');
         $this->elementEnd('form');
-
     }
 
     /**
@@ -168,63 +207,23 @@ else store in BD
 
     function handlePost()
     {
-    /*
         // CSRF protection
-
         $token = $this->trimmed('token');
         if (!$token || $token != common_session_token()) {
             $this->showForm(_('There was a problem with your session token. '.
-                               'Try again, please.'));
-            return;
-        }
-
-        $user = common_current_user();
-        assert(!is_null($user)); // should already be checked
-
-        // FIXME: scrub input
-
-        $newpassword = $this->arg('newpassword');
-        $confirm     = $this->arg('confirm');
-
-        # Some validation
-
-        if (strlen($newpassword) < 6) {
-            $this->showForm(_('Password must be 6 or more characters.'));
-            return;
-        } else if (0 != strcmp($newpassword, $confirm)) {
-            $this->showForm(_('Passwords don\'t match.'));
-            return;
-        }
-
-        if ($user->password) {
-            $oldpassword = $this->arg('oldpassword');
-
-            if (!common_check_user($user->nickname, $oldpassword)) {
-                $this->showForm(_('Incorrect old password'));
-                return;
-            }
-        }
-
-        $original = clone($user);
-
-        $user->password = common_munge_password($newpassword, $user->id);
-
-        $val = $user->validate();
-        if ($val !== true) {
-            $this->showForm(_('Error saving user; invalid.'));
+                              'Try again, please.'));
             return;
         }
 
-        if (!$user->update($original)) {
-            $this->serverError(_('Can\'t save new password.'));
-            return;
+        if ($this->arg('save')) {
+            $this->saveDesign();
+        } else if ($this->arg('reset')) {
+            $this->resetDesign();
+        } else {
+            $this->showForm(_('Unexpected form submission.'));
         }
-
-        $this->showForm(_('Password saved.'), true);
-        */
     }
 
-
     /**
      * Add the Farbtastic stylesheet
      *
@@ -261,4 +260,142 @@ else store in BD
         $this->element('script', array('type' => 'text/javascript',
                                        'src' => $farbtasticGo));
     }
+
+    /**
+     * Get a default user design
+     *
+     * @return Design design
+     */
+
+    function defaultDesign()
+    {
+        $defaults = common_config('site', 'design');
+
+        $design = new Design();
+
+        try {
+
+            $color = new WebColor();
+
+            $color->parseColor($defaults['backgroundcolor']);
+            $design->backgroundcolor = $color->intValue();
+
+            $color->parseColor($defaults['contentcolor']);
+            $design->contentcolor = $color->intValue();
+
+            $color->parseColor($defaults['sidebarcolor']);
+            $design->sidebarcolor = $color->intValue();
+
+            $color->parseColor($defaults['textcolor']);
+            $design->sidebarcolor = $color->intValue();
+
+            $color->parseColor($defaults['linkcolor']);
+            $design->linkcolor = $color->intValue();
+
+            $design->backgroundimage = $defaults['backgroundimage'];
+
+        } catch (WebColorException $e) {
+            common_log(LOG_ERR, _('Bad default color settings: ' .
+                $e->getMessage()));
+        }
+
+        return $design;
+    }
+
+    /**
+     * Save or update the user's design settings
+     *
+     * @return void
+     */
+
+    function saveDesign()
+    {
+        $user = common_current_user();
+
+        try {
+
+            $bgcolor = new WebColor($this->trimmed('design_background'));
+            $ccolor  = new WebColor($this->trimmed('design_content'));
+            $sbcolor = new WebColor($this->trimmed('design_sidebar'));
+            $tcolor  = new WebColor($this->trimmed('design_text'));
+            $lcolor  = new WebColor($this->trimmed('design_links'));
+
+        } catch (WebColorException $e) {
+            $this->showForm($e->getMessage());
+            return;
+        }
+
+        $design = User::getDesign();
+
+        if (!isset($design)) {
+
+            $original = clone($design);
+
+            $original->backgroundcolor = $bgcolor->intValue();
+            $original->contentcolor    = $ccolor->intValue();
+            $original->sidebarcolor    = $sbcolor->intValue();
+            $original->textcolor       = $tcolor->intValue();
+            $original->linkcolor       = $lcolor->intValue();
+
+            $result = $design->update($original);
+
+            if ($result === false) {
+                common_log_db_error($design, 'UPDATE', __FILE__);
+                $this->showForm(_('Couldn\'t update your design.'));
+                return;
+            }
+
+            // update design
+        } else {
+
+            $user->query('BEGIN');
+
+            // save new design
+            $design = new Design();
+
+            $design->backgroundcolor = $bgcolor->intValue();
+            $design->contentcolor    = $ccolor->intValue();
+            $design->sidebarcolor    = $sbcolor->intValue();
+            $design->textcolor       = $tcolor->intValue();
+            $design->linkcolor       = $lcolor->intValue();
+            $design->backgroundimage = $defaults['backgroundimage'];
+
+            $id = $design->insert();
+
+            if (empty($id)) {
+                common_log_db_error($id, 'INSERT', __FILE__);
+                $this->showForm(_('Unable to save your design settings!'));
+                return;
+            }
+
+            $original = clone($user);
+            $user->design_id = $id;
+            $result = $user->update($original);
+
+            if (empty($result)) {
+                common_log_db_error($original, 'UPDATE', __FILE__);
+                $this->showForm(_('Unable to save your design settings!'));
+                $user->query('ROLLBACK');
+                return;
+            }
+
+            $user->query('COMMIT');
+
+        }
+
+        $this->showForm(_('Design preferences saved.'), true);
+    }
+
+    /**
+     * Reset design settings to previous saved value if any, or
+     * the defaults
+     *
+     * @return void
+     */
+
+    function resetDesign()
+    {
+        $this->showForm(_('Design preferences reset.'), true);
+    }
+
 }
index 7e52cdbcc6af6d20b88be1944f038a306d999c0c..c793f582491035d752ae1b696f4a2bed8764ebd5 100644 (file)
@@ -19,7 +19,7 @@
 
 if (!defined('LACONICA')) { exit(1); }
 
-class InviteAction extends Action
+class InviteAction extends CurrentUserDesignAction
 {
     var $mode = null;
     var $error = null;
index eac4d0a3aeeda3622eec4bcbaec8a787fbbe82ac..d7ed440e9237d0a32fd814eb1dd99269ad6393f9 100644 (file)
@@ -45,9 +45,8 @@ require_once INSTALLDIR.'/lib/feedlist.php';
  * @link     http://laconi.ca/
  */
 
-class RepliesAction extends Action
+class RepliesAction extends OwnerDesignAction
 {
-    var $user = null;
     var $page = null;
 
     /**
index e3088dcbd83d6e26dc51110ecd633f626e78becc..7ead6e6e49172e4941035e0a4c5d433c210f9026 100644 (file)
@@ -46,9 +46,8 @@ require_once INSTALLDIR.'/lib/grouplist.php';
  * @link     http://laconi.ca/
  */
 
-class UsergroupsAction extends Action
+class UsergroupsAction extends OwnerDesignAction
 {
-    var $user = null;
     var $page = null;
     var $profile = null;
 
diff --git a/classes/Design.php b/classes/Design.php
new file mode 100644 (file)
index 0000000..bb1e917
--- /dev/null
@@ -0,0 +1,57 @@
+<?php
+/*
+ * Laconica - the distributed open-source microblogging tool
+ * Copyright (C) 2009, Control Yourself, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+if (!defined('LACONICA')) { exit(1); }
+
+/**
+ * Table Definition for design
+ */
+
+require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
+
+class Design extends Memcached_DataObject
+{
+    ###START_AUTOCODE
+    /* the code below is auto generated do not remove the above tag */
+
+    public $__table = 'design';                          // table name
+    public $id;                              // int(4)  primary_key not_null
+    public $backgroundcolor;                 // int(4)
+    public $contentcolor;                    // int(4)
+    public $sidebarcolor;                    // int(4)
+    public $textcolor;                       // int(4)
+    public $linkcolor;                       // int(4)
+    public $backgroundimage;                 // varchar(255)
+
+    /* Static get */
+    function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Design',$k,$v); }
+
+    /* the code above is auto generated do not remove the tag below */
+    ###END_AUTOCODE
+
+    function showCSS($out)
+    {
+        $out->element('stylesheet', array('type' => 'text/css'),
+                      'body { background-color: #' . dechex($this->backgroundcolor) . '} '."\n".
+                      '#content { background-color #' . dechex($this->contentcolor) . '} '."\n".
+                      '#aside_primary { background-color #'. dechex($this->sidebarcolor) .'} '."\n".
+                      'html body { color: #'. dechex($this->textcolor) .'} '."\n".
+                      'a { color: #' . dechex($this->linkcolor) . '} '."\n");
+    }
+}
index 08a166d5ae4a4478be5943cd69eee776834e54ec..c7eede94e19e81c4f6231744f23c085e104f37e7 100644 (file)
@@ -62,14 +62,13 @@ class User extends Memcached_DataObject
     public $autosubscribe;                   // tinyint(1)
     public $urlshorteningservice;            // varchar(50)   default_ur1.ca
     public $inboxed;                         // tinyint(1)
+    public $design_id;                       // int(4)
+    public $viewdesigns;                     // tinyint(1)   default_1
     public $created;                         // datetime()   not_null
     public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
 
     /* Static get */
-    function staticGet($k,$v=NULL)
-    {
-        return Memcached_DataObject::staticGet('User',$k,$v);
-    }
+    function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('User',$k,$v); }
 
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
@@ -684,4 +683,9 @@ class User extends Memcached_DataObject
 
         return ($cnt > 0);
     }
+
+    function getDesign()
+    {
+        return Design::staticGet('id', $this->design_id);
+    }
 }
old mode 100644 (file)
new mode 100755 (executable)
index df292bb..c04ae75
@@ -38,6 +38,18 @@ modified = 384
 [consumer__keys]
 consumer_key = K
 
+[design]
+id = 129
+backgroundcolor = 1
+contentcolor = 1
+sidebarcolor = 1
+textcolor = 1
+linkcolor = 1
+backgroundimage = 2
+
+[design__keys]
+id = N
+
 [fave]
 notice_id = 129
 user_id = 129
@@ -430,6 +442,8 @@ uri = 2
 autosubscribe = 17
 urlshorteningservice = 2
 inboxed = 17
+design_id = 1
+viewdesigns = 17
 created = 142
 modified = 384
 
index b8c0824f5aa765b024a924c124142d5ac482aab7..bd95d1ade639063ccdbd1ac15cf6f2f11edc486d 100644 (file)
@@ -41,6 +41,7 @@ create table sms_carrier (
 /* local users */
 
 create table user (
+
     id integer primary key comment 'foreign key to profile table' references profile (id),
     nickname varchar(64) unique key comment 'nickname or username, duped in profile',
     password varchar(255) comment 'salted password, can be null for OpenID users',
@@ -69,6 +70,9 @@ create table user (
     autosubscribe tinyint default 0 comment 'automatically subscribe to users who subscribe to us',
     urlshorteningservice varchar(50) default 'ur1.ca' comment 'service to use for auto-shortening URLs',
     inboxed tinyint default 0 comment 'has an inbox been created for this user?',
+    design_id integer comment 'id of a design' references design(id),
+    viewdesigns tinyint default 1 comment 'whether to view user-provided designs',
+
     created datetime not null comment 'date this record was created',
     modified timestamp comment 'date this record was modified',
 
@@ -484,6 +488,16 @@ create table file_to_post (
     unique(file_id, post_id)
 ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
 
+create table design (
+    id integer primary key auto_increment comment 'design ID',
+    backgroundcolor integer comment 'main background color',
+    contentcolor integer comment 'content area background color',
+    sidebarcolor integer comment 'sidebar background color',
+    textcolor integer comment 'text color',
+    linkcolor integer comment 'link color',
+    backgroundimage varchar(255) comment 'background image, if any'
+) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
+
 create table group_block (
    group_id integer not null comment 'group profile is blocked from' references user_group (id),
    blocked integer not null comment 'profile that is blocked' references profile (id),
index 0149eca7d9f30f2a82d9500238353476368e916c..2f202ced1f95e530cf463e979e9ba4f266784bdc 100644 (file)
@@ -10,19 +10,19 @@ $(document).ready(function() {
     function UpdateColors(S) {
         C = $(S).val();
         switch (parseInt(S.id.slice(-1))) {
-            case 0: default:
+            case 1: default:
                 $('body').css({'background-color':C});
                 break;
-            case 1:
-                $('#content').css({'background-color':C});
-                break;
             case 2:
-                $('#aside_primary').css({'background-color':C});
+                $('#content').css({'background-color':C});
                 break;
             case 3:
-                $('body').css({'color':C});
+                $('#aside_primary').css({'background-color':C});
                 break;
             case 4:
+                $('html body').css({'color':C});
+                break;
+            case 5:
                 $('a').css({'color':C});
                 break;
         }
@@ -59,7 +59,9 @@ $(document).ready(function() {
         swatches
             .each(SynchColors)
             .blur(function() {
-                $(this).val($(this).val().toUpperCase());
+                tv = $(this).val();
+                $(this).val(tv.toUpperCase());
+                (tv.length == 4) ? ((tv[0] == '#') ? $(this).val('#'+tv[1]+tv[1]+tv[2]+tv[2]+tv[3]+tv[3]) : '') : '';
              })
             .focus(function() {
                 $('#color-picker').show();
index 45e4fa319687761ee9dc31d3b617b7cfc18a2e5e..e1726df2876e8f24fd19f855e85a39ea0a7836f4 100644 (file)
@@ -46,7 +46,6 @@ if (!defined('LACONICA')) {
  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
  * @link     http://laconi.ca/
  * @see      Notice
- * @see      StreamAction
  * @see      NoticeListItem
  * @see      ProfileNoticeList
  */
index 51204cedeaa70e001d5c4020ba973d2b06ebc466..1381d80477f2506322abe96ed95fc3bb2412ff60 100644 (file)
@@ -71,6 +71,14 @@ $config =
         array('name' => 'Just another Laconica microblog',
               'server' => $_server,
               'theme' => 'default',
+              'skin' => 'default',
+              'design' =>
+              array('backgroundcolor' => '#F0F2F5',
+                    'contentcolor' => '#FFFFFF',
+                    'sidebarcolor' => '#CEE1E9',
+                    'textcolor' => '#000000',
+                    'linkcolor' => '#002E6E',
+                    'backgroundimage' => null),
               'path' => $_path,
               'logfile' => null,
               'logo' => null,
diff --git a/lib/currentuserdesignaction.php b/lib/currentuserdesignaction.php
new file mode 100644 (file)
index 0000000..2975256
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Laconica, the distributed open-source microblogging tool
+ *
+ * Base class for actions that use the current user's design
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  Action
+ * @package   Laconica
+ * @author    Evan Prodromou <evan@controlyourself.ca>
+ * @copyright 2009 Control Yourself, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://laconi.ca/
+ */
+
+if (!defined('LACONICA')) {
+    exit(1);
+}
+
+/**
+ * Base class for actions that use the current user's design
+ *
+ * Some pages (settings in particular) use the current user's chosen
+ * design. This superclass returns that design.
+ *
+ * @category Action
+ * @package  Laconica
+ * @author   Evan Prodromou <evan@controlyourself.ca>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://laconi.ca/
+ *
+ */
+
+class CurrentUserDesignAction extends Action
+{
+    /**
+     * A design for this action
+     *
+     * if the user attribute has been set, returns that user's
+     * design.
+     *
+     * @return Design a design object to use
+     */
+
+    function getDesign()
+    {
+        $cur = common_current_user();
+
+        if (empty($cur)) {
+            return null;
+        }
+
+        return $cur->getDesign();
+    }
+}
index 8fa11a7562752f217edb65bb206f797b5732c40a..498c828514b5f30b57b90ce4817a2d1984e1b587 100644 (file)
@@ -27,10 +27,9 @@ require_once INSTALLDIR.'/lib/profilelist.php';
 
 define('AVATARS_PER_PAGE', 80);
 
-class GalleryAction extends Action
+class GalleryAction extends OwnerDesignAction
 {
     var $profile = null;
-    var $user = null;
     var $page = null;
     var $tag = null;
 
index 01bbf5721a4450426f2b53a0d731979fa76c1b02..766510a47b94318d4d0eb78a8021a584c9fefd84 100644 (file)
@@ -47,11 +47,11 @@ define('MESSAGES_PER_PAGE', 20);
  * @see      OutboxAction
  */
 
-class MailboxAction extends PersonalAction
+class MailboxAction extends CurrentUserDesignAction
 {
     var $page = null;
 
-    function prepare($args) 
+    function prepare($args)
     {
         parent::prepare($args);
 
@@ -265,12 +265,12 @@ class MailboxAction extends PersonalAction
      * Returns either the name (and link) of the API client that posted the notice,
      * or one of other other channels.
      *
-     * @param string $source the source of the message 
+     * @param string $source the source of the message
      *
      * @return void
      */
 
-    function showSource($source) 
+    function showSource($source)
     {
         $source_name = _($source);
         switch ($source) {
index c312292abacc1999a09b28ca90cede5a7296dbfb..ad792441a3794765df430698c0721a65b0737e37 100644 (file)
@@ -50,7 +50,6 @@ require_once INSTALLDIR.'/lib/attachmentlist.php';
  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
  * @link     http://laconi.ca/
  * @see      Notice
- * @see      StreamAction
  * @see      NoticeListItem
  * @see      ProfileNoticeList
  */
diff --git a/lib/ownerdesignaction.php b/lib/ownerdesignaction.php
new file mode 100644 (file)
index 0000000..c47633b
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Laconica, the distributed open-source microblogging tool
+ *
+ * Base class for actions that use the page owner's design
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  Action
+ * @package   Laconica
+ * @author    Evan Prodromou <evan@controlyourself.ca>
+ * @copyright 2009 Control Yourself, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://laconi.ca/
+ */
+
+if (!defined('LACONICA')) {
+    exit(1);
+}
+
+/**
+ * Base class for actions that use the page owner's design
+ *
+ * Some pages have a clear "owner" -- like the profile page, subscriptions
+ * pages, etc. This superclass uses that owner's chosen design for the page
+ * design.
+ *
+ * @category Action
+ * @package  Laconica
+ * @author   Evan Prodromou <evan@controlyourself.ca>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://laconi.ca/
+ *
+ */
+
+class OwnerDesignAction extends Action {
+
+    /** The user for this page. */
+
+    var $user = null;
+
+    /**
+     * A design for this action
+     *
+     * if the user attribute has been set, returns that user's
+     * design.
+     *
+     * @return Design a design object to use
+     */
+
+    function getDesign()
+    {
+        if (empty($this->user)) {
+            return null;
+        }
+
+        return $this->user->getDesign();
+    }
+}
diff --git a/lib/personal.php b/lib/personal.php
deleted file mode 100644 (file)
index f927323..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-/**
- * Laconica, the distributed open-source microblogging tool
- *
- * User profile page
- *
- * PHP version 5
- *
- * LICENCE: This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- * @category  Personal
- * @package   Laconica
- * @author    Evan Prodromou <evan@controlyourself.ca>
- * @author    Sarven Capadisli <csarven@controlyourself.ca>
- * @copyright 2008-2009 Control Yourself, Inc.
- * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
- * @link      http://laconi.ca/
- */
-
-if (!defined('LACONICA')) {
-    exit(1);
-}
-
-/**
- * Base class for user profile page
- *
- * @category Personal
- * @package  Laconica
- * @author   Evan Prodromou <evan@controlyourself.ca>
- * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
- * @link     http://laconi.ca/
- */
-
-class PersonalAction extends Action
-{
-
-    var $user = null;
-
-    function isReadOnly($args)
-    {
-         return true;
-    }
-
-    function handle($args)
-    {
-        parent::handle($args);
-    }
-
-}
index 298f34b2212f3773c540dc92c485d2f713d51dcd..2519922b2b28e8292e9a4a51e270b8e6af3e8416 100644 (file)
@@ -47,9 +47,8 @@ require_once INSTALLDIR.'/lib/groupminilist.php';
  * @link     http://laconi.ca/
  */
 
-class ProfileAction extends Action
+class ProfileAction extends OwnerDesignAction
 {
-    var $user    = null;
     var $page    = null;
     var $profile = null;
     var $tag     = null;
index db20c580436b46e0ae4bc361d65013d2234d43d2..17d3a2f64dcb1853190ee0064b6a224d01342be0 100644 (file)
@@ -43,7 +43,7 @@ if (!defined('LACONICA')) {
  * @see      Widget
  */
 
-class SettingsAction extends Action
+class SettingsAction extends CurrentUserDesignAction
 {
     /**
      * A message for the user.
diff --git a/lib/stream.php b/lib/stream.php
deleted file mode 100644 (file)
index 0cb9e0b..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/*
- * Laconica - a distributed open-source microblogging tool
- * Copyright (C) 2008, Controlez-Vous, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
- */
-
-if (!defined('LACONICA')) { exit(1); }
-
-require_once(INSTALLDIR.'/lib/personal.php');
-require_once(INSTALLDIR.'/lib/noticelist.php');
-
-class StreamAction extends PersonalAction
-{
-    function show_notice_list($notice)
-    {
-        $nl = new NoticeList($notice);
-        return $nl->show();
-    }
-}
diff --git a/lib/webcolor.php b/lib/webcolor.php
new file mode 100644 (file)
index 0000000..aaf31d9
--- /dev/null
@@ -0,0 +1,192 @@
+<?php
+/**
+ * Laconica, the distributed open-source microblogging tool
+ *
+ * Base class for deleting things
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  Personal
+ * @package   Laconica
+ * @author    Zach Copley <zach@controlyourself.ca>
+ * @copyright 2009 Control Yourself, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://laconi.ca/
+ */
+
+if (!defined('LACONICA')) {
+     exit(1);
+}
+
+class WebColor {
+
+    // XXX: Maybe make getters and setters for r,g,b values and tuples,
+    // e.g.: to support this kinda CSS representation: rgb(255,0,0)
+    // http://www.w3.org/TR/CSS21/syndata.html#color-units
+
+    var $red   = 0;
+    var $green = 0;
+    var $blue  = 0;
+
+    /**
+     * Constructor
+     *
+     * @return nothing
+     */
+
+    function __construct($color = null)
+    {
+        if (isset($color)) {
+            $this->parseColor($color);
+        }
+    }
+
+    /**
+     * Parses input to and tries to determine whether the color
+     * is being specified via an integer or hex tuple and sets
+     * the RGB instance variables accordingly.
+     *
+     * XXX: Maybe support (r,g,b) style, and array?
+     *
+     * @param mixed $color
+     *
+     * @return nothing
+     */
+
+    function parseColor($color) {
+
+        if (is_numeric($color)) {
+            $this->setIntColor($color);
+        } else {
+
+            // XXX named colors
+
+            // XXX: probably should do even more validation
+
+            if (preg_match('/(#([0-9A-Fa-f]{3,6})\b)/u', $color) > 0) {
+                $this->setHexColor($color);
+            } else {
+                $errmsg = _('%s is not a valid color!');
+                throw new WebColorException(sprintf($errmsg, $color));
+            }
+        }
+    }
+
+    /**
+     * @param string $name
+     *
+     * @return nothing
+     */
+
+    function setNamedColor($name)
+    {
+        // XXX Implement this
+    }
+
+
+    /**
+     * Sets the RGB color values from a a hex tuple
+     *
+     * @param string $hexcolor
+     *
+     * @return nothing
+     */
+
+    function setHexColor($hexcolor) {
+
+        if ($hexcolor[0] == '#') {
+            $hexcolor = substr($hexcolor, 1);
+        }
+
+        if (strlen($hexcolor) == 6) {
+            list($r, $g, $b) = array($hexcolor[0].$hexcolor[1],
+                                     $hexcolor[2].$hexcolor[3],
+                                     $hexcolor[4].$hexcolor[5]);
+        } elseif (strlen($hexcolor) == 3) {
+            list($r, $g, $b) = array($hexcolor[0].$hexcolor[0],
+                                     $hexcolor[1].$hexcolor[1],
+                                     $hexcolor[2].$hexcolor[2]);
+        } else {
+            $errmsg = _('%s is not a valid color! Use 3 or 6 hex chars.');
+            throw new WebColorException(sprintf($errmsg, $hexcolor));
+        }
+
+        $this->red   = hexdec($r);
+        $this->green = hexdec($g);
+        $this->blue  = hexdec($b);
+
+    }
+
+    /**
+     * Sets the RGB color values from a 24-bit integer
+     *
+     * @param int $intcolor
+     *
+     * @return nothing
+     */
+
+    function setIntColor($intcolor)
+    {
+        // We could do 32 bit and have an alpha channel because
+        // Sarven wants one real bad, but nah.
+
+        $this->red   = $intcolor >> 16;
+        $this->green = $intcolor >> 8 & 0xFF;
+        $this->blue  = $intcolor & 0xFF;
+
+    }
+
+    /**
+     * Returns a hex tuple of the RGB color useful for output in HTML
+     *
+     * @return string
+     */
+
+    function hexValue() {
+
+        $hexcolor  = (strlen(dechex($this->red)) < 2 ? '0' : '' ) .
+            dechex($this->red);
+        $hexcolor .= (strlen(dechex($this->green)) < 2 ? '0' : '') .
+            dechex($this->green);
+        $hexcolor .= (strlen(dechex($this->blue)) < 2 ? '0' : '') .
+            dechex($this->blue);
+
+        return $hexcolor;
+
+    }
+
+    /**
+     * Returns a 24-bit packed integer representation of the RGB color
+     * for convenient storage in the DB
+     *
+     * XXX: probably could just use hexdec() instead
+     *
+     * @return int
+     */
+
+    function intValue()
+    {
+        $intcolor = 256 * 256 * $this->red + 256 * $this->green + $this->blue;
+        return $intcolor;
+    }
+
+}
+
+class WebColorException extends Exception
+{
+}
+
+?>
\ No newline at end of file