Skip to content
Snippets Groups Projects
Commit b0fbe578 authored by Rye Mutt's avatar Rye Mutt :bread:
Browse files

Reworked about panel, design inspired by Catznip

parent a32cbacb
No related branches found
No related tags found
No related merge requests found
Showing
with 339 additions and 180 deletions
These are the generous donors to the Alchemy project.
Sorry if I've missed anyone just ping me on discord!
Anarcho Rodentia Autonomous Zone
Sam McGregor#1312
Bellimora Bunny
Bellimora#9570
Farlado UwU
Farlado#1018
Rhea Mercury
Vid#6143
Todd Lygon
Todd Lygon#3391
Tyler C
Vault108#0001
...@@ -42,6 +42,9 @@ static LLDefaultChildRegistry::Register<LLIconCtrl> r("icon"); ...@@ -42,6 +42,9 @@ static LLDefaultChildRegistry::Register<LLIconCtrl> r("icon");
LLIconCtrl::Params::Params() LLIconCtrl::Params::Params()
: image("image_name"), : image("image_name"),
color("color"), color("color"),
// [SL:KB] - Patch: Control-IconCtrl | Checked: Catznip-3.6
commit_on_click("commit_on_click", false),
// [/SL:KB]
use_draw_context_alpha("use_draw_context_alpha", true), use_draw_context_alpha("use_draw_context_alpha", true),
interactable("interactable", false), interactable("interactable", false),
scale_image("scale_image"), scale_image("scale_image"),
...@@ -65,6 +68,14 @@ LLIconCtrl::LLIconCtrl(const LLIconCtrl::Params& p) ...@@ -65,6 +68,14 @@ LLIconCtrl::LLIconCtrl(const LLIconCtrl::Params& p)
{ {
LLUICtrl::setValue(mImagep->getName()); LLUICtrl::setValue(mImagep->getName());
} }
// [SL:KB] - Patch: Control-IconCtrl | Checked: Catznip-3.6
if (p.commit_on_click)
{
// There's several ways we can do this but this just seems like the easiest
setMouseDownCallback(boost::bind(&LLIconCtrl::onCommit, this));
}
// [/SL:KB]
} }
LLIconCtrl::~LLIconCtrl() LLIconCtrl::~LLIconCtrl()
......
...@@ -48,6 +48,9 @@ class LLIconCtrl ...@@ -48,6 +48,9 @@ class LLIconCtrl
{ {
Optional<LLUIImage*> image; Optional<LLUIImage*> image;
Optional<LLUIColor> color; Optional<LLUIColor> color;
// [SL:KB] - Patch: Control-IconCtrl | Checked: Catznip-3.6
Optional<bool> commit_on_click;
// [/SL:KB]
Optional<bool> use_draw_context_alpha, Optional<bool> use_draw_context_alpha,
interactable; interactable;
Optional<S32> min_width, Optional<S32> min_width,
......
...@@ -32,6 +32,9 @@ ...@@ -32,6 +32,9 @@
#include "llfloaterabout.h" #include "llfloaterabout.h"
// Viewer includes // Viewer includes
#if LL_WINDOWS
#include "alsquirrelupdater.h"
#endif
#include "llagent.h" #include "llagent.h"
#include "llagentui.h" #include "llagentui.h"
#include "llappviewer.h" #include "llappviewer.h"
...@@ -63,6 +66,7 @@ ...@@ -63,6 +66,7 @@
#include "lleventapi.h" #include "lleventapi.h"
#include "llcorehttputil.h" #include "llcorehttputil.h"
#include "lldir.h" #include "lldir.h"
#include "lliconctrl.h"
#if LL_WINDOWS #if LL_WINDOWS
#include "lldxhardware.h" #include "lldxhardware.h"
...@@ -90,17 +94,10 @@ class LLFloaterAbout final ...@@ -90,17 +94,10 @@ class LLFloaterAbout final
static LLSD getInfo(); static LLSD getInfo();
void onClickCopyToClipboard(); void onClickCopyToClipboard();
void onClickUpdateCheck(); void onClickUpdateCheck();
static void setUpdateListener();
private: private:
void setSupportText(const std::string& server_release_notes_url); void setSupportText(const std::string& server_release_notes_url);
// notifications for user requested checks
static void showCheckUpdateNotification(S32 state);
// callback method for manual checks
static bool callbackCheckUpdate(LLSD const & event);
// listener name for update checks // listener name for update checks
static const std::string sCheckUpdateListenerName; static const std::string sCheckUpdateListenerName;
...@@ -129,7 +126,10 @@ BOOL LLFloaterAbout::postBuild() ...@@ -129,7 +126,10 @@ BOOL LLFloaterAbout::postBuild()
getChild<LLViewerTextEditor>("support_editor", true); getChild<LLViewerTextEditor>("support_editor", true);
LLViewerTextEditor *contrib_names_widget = LLViewerTextEditor *contrib_names_widget =
getChild<LLViewerTextEditor>("contrib_names", true); getChild<LLViewerTextEditor>("contrib_names", true);
LLViewerTextEditor *suppoter_names_widget =
getChild<LLViewerTextEditor>("alchemy_supporter_names", true);
LLViewerTextEditor *licenses_widget = LLViewerTextEditor *licenses_widget =
getChild<LLViewerTextEditor>("licenses_editor", true); getChild<LLViewerTextEditor>("licenses_editor", true);
...@@ -140,6 +140,26 @@ BOOL LLFloaterAbout::postBuild() ...@@ -140,6 +140,26 @@ BOOL LLFloaterAbout::postBuild()
getChild<LLUICtrl>("update_btn")->setCommitCallback( getChild<LLUICtrl>("update_btn")->setCommitCallback(
boost::bind(&LLFloaterAbout::onClickUpdateCheck, this)); boost::bind(&LLFloaterAbout::onClickUpdateCheck, this));
auto viewer_logo = getChild<LLIconCtrl>("viewer_logo");
auto viewer_maturity = LLVersionInfo::instance().getViewerMaturity();
switch(viewer_maturity)
{
case LLVersionInfo::TEST_VIEWER:
viewer_logo->setImage(LLUI::getUIImage("AlchemyTest128"));
break;
case LLVersionInfo::PROJECT_VIEWER:
viewer_logo->setImage(LLUI::getUIImage("AlchemyProject128"));
break;
case LLVersionInfo::BETA_VIEWER:
viewer_logo->setImage(LLUI::getUIImage("AlchemyBeta128"));
break;
default:
case LLVersionInfo::RELEASE_VIEWER:
viewer_logo->setImage(LLUI::getUIImage("AlchemyRelease128"));
break;
}
static const LLUIColor about_color = LLUIColorTable::instance().getColor("TextFgReadOnlyColor"); static const LLUIColor about_color = LLUIColorTable::instance().getColor("TextFgReadOnlyColor");
if (gAgent.getRegion()) if (gAgent.getRegion())
...@@ -160,23 +180,45 @@ BOOL LLFloaterAbout::postBuild() ...@@ -160,23 +180,45 @@ BOOL LLFloaterAbout::postBuild()
support_widget->setEnabled(FALSE); support_widget->setEnabled(FALSE);
support_widget->startOfDoc(); support_widget->startOfDoc();
// Get the names of contributors, extracted from .../doc/contributions.txt by viewer_manifest.py at build time
std::string contributors_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"contributors.txt");
llifstream contrib_file;
std::string contributors;
contrib_file.open(contributors_path.c_str()); /* Flawfinder: ignore */
if (contrib_file.is_open())
{ {
std::getline(contrib_file, contributors); // all names are on a single line // Get the names of contributors, extracted from .../doc/contributions.txt by viewer_manifest.py at build time
contrib_file.close(); std::string contributors_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"contributors.txt");
llifstream contrib_file;
std::string contributors;
contrib_file.open(contributors_path.c_str()); /* Flawfinder: ignore */
if (contrib_file.is_open())
{
std::getline(contrib_file, contributors); // all names are on a single line
contrib_file.close();
}
else
{
LL_WARNS("AboutInit") << "Could not read contributors file at " << contributors_path << LL_ENDL;
}
contrib_names_widget->setText(contributors);
contrib_names_widget->setEnabled(FALSE);
contrib_names_widget->startOfDoc();
} }
else
{ {
LL_WARNS("AboutInit") << "Could not read contributors file at " << contributors_path << LL_ENDL; // Get the names of supporters, extracted from .../doc/supporters.txt by viewer_manifest.py at build time
std::string supporters_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"supporters.txt");
llifstream supporters_file;
std::string supporters;
supporters_file.open(supporters_path.c_str()); /* Flawfinder: ignore */
if (supporters_file.is_open())
{
std::getline(supporters_file, supporters); // all names are on a single line
supporters_file.close();
}
else
{
LL_WARNS("AboutInit") << "Could not read supporters file at " << supporters_path << LL_ENDL;
}
suppoter_names_widget->setText(supporters);
suppoter_names_widget->setEnabled(FALSE);
suppoter_names_widget->startOfDoc();
} }
contrib_names_widget->setText(contributors);
contrib_names_widget->setEnabled(FALSE);
contrib_names_widget->startOfDoc();
// Get the Versions and Copyrights, created at build time // Get the Versions and Copyrights, created at build time
std::string licenses_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"packages-info.txt"); std::string licenses_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"packages-info.txt");
...@@ -317,7 +359,12 @@ void LLFloaterAbout::onClickCopyToClipboard() ...@@ -317,7 +359,12 @@ void LLFloaterAbout::onClickCopyToClipboard()
void LLFloaterAbout::onClickUpdateCheck() void LLFloaterAbout::onClickUpdateCheck()
{ {
setUpdateListener(); #if LL_WINDOWS
if (ALUpdateHandler::isSupported())
{
ALUpdateHandler::getInstance()->check();
}
#endif
} }
void LLFloaterAbout::setSupportText(const std::string& server_release_notes_url) void LLFloaterAbout::setSupportText(const std::string& server_release_notes_url)
...@@ -340,94 +387,6 @@ void LLFloaterAbout::setSupportText(const std::string& server_release_notes_url) ...@@ -340,94 +387,6 @@ void LLFloaterAbout::setSupportText(const std::string& server_release_notes_url)
FALSE, LLStyle::Params() .color(about_color)); FALSE, LLStyle::Params() .color(about_color));
} }
//This is bound as a callback in postBuild()
void LLFloaterAbout::setUpdateListener()
{
typedef std::vector<std::string> vec;
//There are four possibilities:
//no downloads directory or version directory in "getOSUserAppDir()/downloads"
// => no update
//version directory exists and .done file is not present
// => download in progress
//version directory exists and .done file exists
// => update ready for install
//version directory, .done file and either .skip or .next file exists
// => update deferred
BOOL downloads = false;
std::string downloadDir = "";
BOOL done = false;
BOOL next = false;
BOOL skip = false;
LLSD info(LLFloaterAbout::getInfo());
std::string version = info["VIEWER_VERSION_STR"].asString();
std::string appDir = gDirUtilp->getOSUserAppDir();
//drop down two directory levels so we aren't searching for markers among the log files and crash dumps
//or among other possible viewer upgrade directories if the resident is running multiple viewer versions
//we should end up with a path like ../downloads/1.2.3.456789
vec file_vec = gDirUtilp->getFilesInDir(appDir);
for(vec::const_iterator iter=file_vec.begin(); iter!=file_vec.end(); ++iter)
{
if ( (iter->rfind("downloads") ) )
{
vec dir_vec = gDirUtilp->getFilesInDir(*iter);
for(vec::const_iterator dir_iter=dir_vec.begin(); dir_iter!=dir_vec.end(); ++dir_iter)
{
if ( (dir_iter->rfind(version)))
{
downloads = true;
downloadDir = *dir_iter;
}
}
}
}
if ( downloads )
{
for(vec::const_iterator iter=file_vec.begin(); iter!=file_vec.end(); ++iter)
{
if (iter->rfind(version) != std::string::npos)
{
if (iter->rfind(".done") != std::string::npos)
{
done = true;
}
else if (iter->rfind(".next") != std::string::npos)
{
next = true;
}
else if (iter->rfind(".skip") != std::string::npos)
{
skip = true;
}
}
}
}
if ( !downloads )
{
LLNotificationsUtil::add("UpdateViewerUpToDate");
}
else
{
if ( !done )
{
LLNotificationsUtil::add("UpdateDownloadInProgress");
}
else if ( (!next) && (!skip) )
{
LLNotificationsUtil::add("UpdateDownloadComplete");
}
else //done and there is a next or skip
{
LLNotificationsUtil::add("UpdateDeferred");
}
}
}
///---------------------------------------------------------------------------- ///----------------------------------------------------------------------------
/// LLFloaterAboutUtil /// LLFloaterAboutUtil
///---------------------------------------------------------------------------- ///----------------------------------------------------------------------------
...@@ -436,9 +395,3 @@ void LLFloaterAboutUtil::registerFloater() ...@@ -436,9 +395,3 @@ void LLFloaterAboutUtil::registerFloater()
LLFloaterReg::add("sl_about", "floater_about.xml", LLFloaterReg::add("sl_about", "floater_about.xml",
&LLFloaterReg::build<LLFloaterAbout>); &LLFloaterReg::build<LLFloaterAbout>);
} }
void LLFloaterAboutUtil::checkUpdatesAndNotify()
{
LLFloaterAbout::setUpdateListener();
}
...@@ -30,9 +30,6 @@ ...@@ -30,9 +30,6 @@
namespace LLFloaterAboutUtil namespace LLFloaterAboutUtil
{ {
void registerFloater(); void registerFloater();
// Support for user initialized update/state checks
void checkUpdatesAndNotify();
} }
#endif // LL_LLFLOATERABOUT_H #endif // LL_LLFLOATERABOUT_H
indra/newview/skins/default/textures/alchemy/alchemy_128.png

19.3 KiB

indra/newview/skins/default/textures/alchemy/alchemybeta_128.png

22.6 KiB

indra/newview/skins/default/textures/alchemy/alchemyproject_128.png

22.6 KiB

indra/newview/skins/default/textures/alchemy/alchemytest_128.png

22.5 KiB

indra/newview/skins/default/textures/alchemy/discord_32.png

1.12 KiB

indra/newview/skins/default/textures/alchemy/mastodon_32.png

1.2 KiB

...@@ -910,4 +910,12 @@ with the same filename but different name ...@@ -910,4 +910,12 @@ with the same filename but different name
<texture name="System_Notification" file_name="icons/SL_Logo.png" preload="true"/> <texture name="System_Notification" file_name="icons/SL_Logo.png" preload="true"/>
<texture name="Icon_Attachment_Small" file_name="icons/Icon_Attachment_Small.png" preload="true"/> <texture name="Icon_Attachment_Small" file_name="icons/Icon_Attachment_Small.png" preload="true"/>
<texture name="Icon_Attachment_Large" file_name="icons/Icon_Attachment_Large.png" preload="true"/> <texture name="Icon_Attachment_Large" file_name="icons/Icon_Attachment_Large.png" preload="true"/>
<texture name="AlchemyRelease128" file_name="alchemy/alchemy_128.png" preload="false" />
<texture name="AlchemyBeta128" file_name="alchemy/alchemybeta_128.png" preload="false" />
<texture name="AlchemyProject128" file_name="alchemy/alchemyproject_128.png" preload="false" />
<texture name="AlchemyTest128" file_name="alchemy/alchemytest_128.png" preload="false" />
<texture name="social_discord" file_name="alchemy/discord_32.png" preload="false" />
<texture name="social_mastodon" file_name="alchemy/mastodon_32.png" preload="false" />
</textures> </textures>
<?xml version="1.0" encoding="utf-8" standalone="yes" ?> <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater <floater
positioning="centered" can_close="true"
legacy_header_height="18" can_minimize="true"
height="440" can_resize="false"
layout="topleft" height="380"
name="floater_about"
help_topic="floater_about" help_topic="floater_about"
name="floater_about"
positioning="centered"
save_rect="true" save_rect="true"
save_visibility="false"
title="ABOUT [CAPITALIZED_APP_NAME]" title="ABOUT [CAPITALIZED_APP_NAME]"
width="500"> width="580">
RestrainedLove API: [RLV_VERSION]
<tab_container <tab_container
follows="all" follows="all"
top="25" layout="topleft"
left="10" left="4"
height="405" height="378"
width="480" right="-4"
tab_height="25"
tab_min_width="120"
name="about_tab" name="about_tab"
tab_position="top"> tab_position="top"
top="2">
<panel <panel
border="true" border="true"
label="Info" has_border="true"
label="INFO"
help_topic="about_support_tab" help_topic="about_support_tab"
name="support_panel"> name="support_panel">
<icon
height="128"
image_name="AlchemyRelease128"
layout="topleft"
left="0"
mouse_opaque="true"
name="viewer_logo"
top="4"
width="128" />
<icon
interactable="true"
commit_on_click="true"
height="32"
image_name="social_discord"
layout="topleft"
left="20"
mouse_opaque="true"
name="discord_icon"
tooltip="[APP_NAME] on Discord"
top="140"
width="42">
<icon.commit_callback
function="Advanced.ShowURL"
parameter="https://discordapp.com/invite/KugCgs6" />
</icon>
<icon
interactable="true"
commit_on_click="true"
height="32"
image_name="social_mastodon"
layout="topleft"
left_pad="20"
mouse_opaque="true"
name="mastodon_icon"
tooltip="[APP_NAME] on Mastodon"
top="140"
width="30">
<icon.commit_callback
function="Advanced.ShowURL"
parameter="https://mastodon.social/@alchemyviewer" />
</icon>
<button
follows="bottom|left"
tool_tip="Check for and download updates."
name="copy_btn"
label="Check for Updates"
left="3"
bottom="-30"
height="22"
width="125" />
<button
follows="bottom|left"
image_overlay="Copy"
image_overlay_alignment="left"
tool_tip="Copy the info the clipboard."
name="copy_btn"
label="Copy Info"
left="3"
bottom="4"
height="22"
width="125" />
<text_editor <text_editor
parse_urls="true" parse_urls="true"
follows="top|left" follows="top|left"
font="SansSerif" font="SansSerif"
height="343" height="341"
bg_readonly_color="Transparent" bg_readonly_color="Transparent"
left="5" left="133"
max_length="65536" max_length="65536"
name="support_editor" name="support_editor"
top="5" top="5"
width="465" right="-5"
word_wrap="true" /> word_wrap="true" />
<button
follows="left|top"
label="Copy to Clipboard"
name="copy_btn"
left="10"
top_pad="5"
height="25"
width="180" />
</panel> </panel>
<panel <panel
border="true" border="true"
label="Credits" has_border="true"
label="CREDITS"
help_topic="about_credits_tab" help_topic="about_credits_tab"
name="credits_panel"> name="credits_panel">
<accordion
fit_parent="false"
follows="all"
layout="topleft"
left="2"
name="credits_accordion"
single_expansion="true"
top="0"
right="-1">
<!-- Credits -->
<accordion_tab
expanded="true"
fit_panel="false"
layout="topleft"
name="alchemy_credits_tab"
title="Alchemy">
<panel
border="false"
follows="all"
left="10"
name="alchemy_credits_panel"
height="295"
top="10">
<text <text
follows="top|left|right" follows="top|left|right"
font.style="BOLD"
height="10"
layout="topleft"
left="5"
name="alchemy_intro"
top="0"
width="435"
wrap="true">
Alchemy is brought to you by the Alchemy Development Group:
</text>
<text_editor
enabled="false"
follows="top|left"
height="100"
bg_readonly_color="Transparent"
left="5"
text_color="LtGray"
max_length="65536"
name="alchemy_names"
top_pad="5"
width="545"
word_wrap="true">
Rye Cogtail
Luminous Luminos
Unexpectedly Dismantled
Cinder Roxley
Inusaito Kanya
Zanibar Darkstone
Doug Falta
</text_editor>
<text
follows="top|left"
font.style="BOLD"
height="10"
layout="topleft"
left="5"
name="alchemy_thanks_intro"
top_pad="5"
width="435"
wrap="true">
with special thanks to:
</text>
<text_editor
enabled="false"
follows="top|left"
height="150"
bg_readonly_color="Transparent"
left="5"
text_color="LtGray"
max_length="65536"
name="alchemy_supporter_names"
top_pad="5"
width="545"
word_wrap="true">
Dummy Name replaced at run time
</text_editor>
</panel>
</accordion_tab>
<accordion_tab
expanded="true"
fit_panel="false"
layout="topleft"
name="sl_credits_tab"
title="Second Life">
<panel
border="false"
follows="all"
left="10"
name="sl_credits_panel"
height="332"
top="10">
<text
follows="top|left|right"
font.style="BOLD"
height="20" height="20"
layout="topleft" layout="topleft"
left="5" left="5"
name="linden_intro" name="linden_intro"
top="10" top="0"
width="465" width="465"
wrap="true"> wrap="true">
Second Life is brought to you by the Lindens, Second Life is brought to you by the Lindens,
...@@ -65,63 +221,74 @@ with open source contributions from: ...@@ -65,63 +221,74 @@ with open source contributions from:
<text_editor <text_editor
enabled="false" enabled="false"
follows="top|left" follows="top|left"
height="340" height="270"
bg_readonly_color="Transparent" bg_readonly_color="Transparent"
left="5" left="5"
text_color="LtGray" text_color="LtGray"
max_length="65536" max_length="65536"
name="contrib_names" name="contrib_names"
top_pad="10" top_pad="5"
width="465" width="545"
word_wrap="true"> word_wrap="true">
Dummy Name replaced at run time Dummy Name replaced at run time
</text_editor> </text_editor>
</panel> </panel>
</accordion_tab>
</accordion>
</panel>
<!-- Licences -->
<panel <panel
border="true" border="true"
label="Licenses" has_border="true"
label="LICENCES"
help_topic="about_licenses_tab" help_topic="about_licenses_tab"
name="licenses_panel"> name="licenses_panel">
<text_editor <text_editor
enabled="false" enabled="false"
follows="left|top" follows="left|top"
height="375" height="340"
bg_readonly_color="Transparent" bg_readonly_color="Transparent"
left="5" left="5"
text_color="LtGray" text_color="LtGray"
max_length="65536" max_length="65536"
name="licenses_editor" name="licenses_editor"
top="5" top="5"
width="465" right="-5"
word_wrap="true"> word_wrap="true"
3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion parse_urls="true">
APR Copyright (C) 2011 The Apache Software Foundation This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; version 2.1 of the License only which can be found in doc/LGPL-licence.txt in this distribution (or online at https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt).
Collada DOM Copyright 2006 Sony Computer Entertainment Inc.
cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se) This library 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 Lesser General Public License for more details.
DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm, and Werner Lemberg. APR Copyright (C) 2011 The Apache Software Foundation
GL Copyright (C) 1999-2004 Brian Paul. Collada DOM Copyright 2006 Sony Computer Entertainment Inc.
google-perftools Copyright (c) 2005, Google Inc. cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se)
Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
jpeglib Copyright (C) 1991-1998, Thomas G. Lane. FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm, and Werner Lemberg.
meshoptimizer Copyright (c) 2016-2021 Arseny Kapoulkine GL Copyright (C) 1999-2004 Brian Paul.
ogg/vorbis Copyright (C) 2002, Xiphophorus google-perftools Copyright (c) 2005, Google Inc.
OpenSSL Copyright (C) 1998-2008 The OpenSSL Project. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
PCRE Copyright (c) 1997-2012 University of Cambridge jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) meshoptimizer Copyright (c) 2016-2021 Arseny Kapoulkine
xmlrpc-epi Copyright (C) 2000 Epinions, Inc. ogg/vorbis Copyright (C) 2002, Xiphophorus
zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler. OpenSSL Copyright (C) 1998-2008 The OpenSSL Project.
PCRE Copyright (c) 1997-2012 University of Cambridge
SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler.
Second Life Viewer uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details.
Second Life Viewer uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details. This software contains source code provided by NVIDIA Corporation.
This software contains source code provided by NVIDIA Corporation. All rights reserved. See licenses.txt for details.
All rights reserved. See licenses.txt for details. Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
</text_editor> </text_editor>
</panel> </panel>
</tab_container> </tab_container>
......
...@@ -84,6 +84,11 @@ def construct(self): ...@@ -84,6 +84,11 @@ def construct(self):
contributor_names = self.extract_names(contributions_path) contributor_names = self.extract_names(contributions_path)
self.put_in_file(contributor_names, "contributors.txt", src=contributions_path) self.put_in_file(contributor_names, "contributors.txt", src=contributions_path)
# include the extracted list of supporters
supporters_path = "../../doc/supporters.txt"
supporters_names = self.extract_names(supporters_path)
self.put_in_file(supporters_names, "supporters.txt", src=supporters_path)
# ... and the default camera position settings # ... and the default camera position settings
self.path("camera") self.path("camera")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment