Pull merge from lindenlab/viewer-release

master
Merov Linden 2014-09-08 13:35:29 -07:00
commit abacb1bfaa
76 changed files with 1926 additions and 4826 deletions

View File

@ -487,3 +487,4 @@ a9f2d0cb11f73b06858e6083bb50083becc3f9cd 3.7.9-release
3b44ea8988cb902f0dda8429e8d5e4569e304532 3.7.12-release
d86a7e1bc96d27b683f951d3701d5b7042158c68 3.7.13-release
a7872554f3665588f1e8347d472cec3a299254b3 3.7.14-release
3f11f57f2b4d15a9f987d12bc70ef507eefb5018 3.7.15-release

View File

@ -323,6 +323,7 @@ Cinder Roxley
STORM-1951
STORM-2035
STORM-2036
STORM-2037
Clara Young
Coaldust Numbers
VWR-1095
@ -712,6 +713,9 @@ Jonathan Yap
STORM-1986
STORM-1981
STORM-2015
STORM-2031
STORM-2030
STORM-2034
STORM-2018
Kadah Coba
STORM-1060
@ -990,6 +994,38 @@ Nicky Perian
STORM-1090
STORM-1828
Nicoladie Gymnast
NiranV Dean
STORM-2040
STORM-2042
STORM-2043
STORM-2044
STORM-2045
STORM-2046
STORM-2047
STORM-2048
STORM-2049
STORM-2050
STORM-2051
STORM-2052
STORM-2057
STORM-2058
STORM-2059
STORM-2060
STORM-2061
STORM-2063
STORM-2065
STORM-2066
STORM-2068
STORM-2073
STORM-2076
BUG-372
BUG-1179
BUG-6835
BUG-6837
BUG-6839
BUG-6840
BUG-6958
BUG-7020
Nounouch Hapmouche
VWR-238
Ollie Kubrick
@ -1183,6 +1219,7 @@ Sovereign Engineer
OPEN-189
STORM-1972
OPEN-195
OPEN-217
SpacedOut Frye
VWR-34
VWR-45
@ -1358,6 +1395,7 @@ Whirly Fizzle
VWR-29543
MAINT-873
STORM-1930
BUG-6659
Whoops Babii
VWR-631
VWR-1640

View File

@ -71,7 +71,6 @@ add_subdirectory(${LIBS_OPEN_PREFIX}media_plugins)
if (LINUX)
add_subdirectory(${VIEWER_PREFIX}linux_crash_logger)
add_subdirectory(${VIEWER_PREFIX}linux_updater)
if (INSTALL_PROPRIETARY)
include(LLAppearanceUtility)
add_subdirectory(${LLAPPEARANCEUTILITY_SRC_DIR} ${LLAPPEARANCEUTILITY_BIN_DIR})
@ -86,9 +85,8 @@ elseif (WINDOWS)
if (EXISTS ${VIEWER_DIR}win_setup)
add_subdirectory(${VIEWER_DIR}win_setup)
endif (EXISTS ${VIEWER_DIR}win_setup)
add_subdirectory(${VIEWER_PREFIX}win_updater)
# add_dependencies(viewer windows-updater windows-setup windows-crash-logger)
add_dependencies(viewer windows-updater windows-crash-logger)
# add_dependencies(viewer windows-setup windows-crash-logger)
add_dependencies(viewer windows-crash-logger)
elseif (SOLARIS)
add_subdirectory(solaris_crash_logger)
add_dependencies(viewer solaris-crash-logger)

View File

@ -1,57 +0,0 @@
# -*- cmake -*-
project(linux_updater)
include(00-Common)
include(CURL)
include(CARes)
include(OpenSSL)
include(UI)
include(LLCommon)
include(LLMessage)
include(LLVFS)
include(LLXML)
include(LLUI)
include(Linking)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
${LLVFS_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
${LLUI_INCLUDE_DIRS}
${CURL_INCLUDE_DIRS}
${CARES_INCLUDE_DIRS}
${OPENSSL_INCLUDE_DIRS}
${UI_INCLUDE_DIRS}
)
include_directories(SYSTEM
${LLCOMMON_SYSTEM_INCLUDE_DIRS}
${LLXML_SYSTEM_INCLUDE_DIRS}
)
set(linux_updater_SOURCE_FILES linux_updater.cpp)
set(linux_updater_HEADER_FILES CMakeLists.txt)
set_source_files_properties(${linux_updater_HEADER_FILES}
PROPERTIES HEADER_FILES_ONLY TRUE)
list(APPEND linux_updater_SOURCE_FILES ${linux_updater_HEADER_FILES})
add_executable(linux-updater ${linux_updater_SOURCE_FILES})
target_link_libraries(linux-updater
${CURL_LIBRARIES}
${CARES_LIBRARIES}
${OPENSSL_LIBRARIES}
${CRYPTO_LIBRARIES}
${LLMESSAGE_LIBRARIES}
${UI_LIBRARIES}
${LLXML_LIBRARIES}
${LLUI_LIBRARIES}
${LLVFS_LIBRARIES}
${LLCOMMON_LIBRARIES}
)
add_custom_target(linux-updater-target ALL
DEPENDS linux-updater)

View File

@ -1,926 +0,0 @@
/**
* @file linux_updater.cpp
* @author Kyle Ambroff <ambroff@lindenlab.com>, Tofu Linden
* @brief Viewer update program for unix platforms that support GTK+
*
* $LicenseInfo:firstyear=2008&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* 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.
*
* 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <set>
#include <iostream>
#include "linden_common.h"
#include "llerrorcontrol.h"
#include "llfile.h"
#include "lldir.h"
#include "lldiriterator.h"
/*==========================================================================*|
// IQA-490: Use of LLTrans -- by this program at least -- appears to be buggy.
// With it, the 3.3.2 beta 1 linux-updater.bin crashes; without it seems stable.
#include "llxmlnode.h"
#include "lltrans.h"
|*==========================================================================*/
static class LLTrans
{
public:
LLTrans();
static std::string getString(const std::string& key);
private:
std::string _getString(const std::string& key) const;
typedef std::map<std::string, std::string> MessageMap;
MessageMap mMessages;
} sLLTransInstance;
#include <curl/curl.h>
#include <map>
#include <boost/foreach.hpp>
extern "C" {
#include <gtk/gtk.h>
}
const guint UPDATE_PROGRESS_TIMEOUT = 100;
const guint UPDATE_PROGRESS_TEXT_TIMEOUT = 1000;
const guint ROTATE_IMAGE_TIMEOUT = 8000;
typedef struct _updater_app_state {
std::string app_name;
std::string url;
std::string file;
std::string image_dir;
std::string dest_dir;
std::string strings_dirs;
std::string strings_file;
LLDirIterator *image_dir_iter;
GtkWidget *window;
GtkWidget *progress_bar;
GtkWidget *image;
double progress_value;
bool activity_mode;
guint image_rotation_timeout_id;
guint progress_update_timeout_id;
guint update_progress_text_timeout_id;
bool failure;
} UpdaterAppState;
// List of entries from strings.xml to always replace
static std::set<std::string> default_trans_args;
void init_default_trans_args()
{
default_trans_args.insert("SECOND_LIFE"); // World
default_trans_args.insert("APP_NAME");
default_trans_args.insert("SECOND_LIFE_GRID");
default_trans_args.insert("SUPPORT_SITE");
}
bool translate_init(std::string comma_delim_path_list,
std::string base_xml_name)
{
return true;
/*==========================================================================*|
init_default_trans_args();
// extract paths string vector from comma-delimited flat string
std::vector<std::string> paths;
LLStringUtil::getTokens(comma_delim_path_list, paths, ","); // split over ','
for(std::vector<std::string>::iterator it = paths.begin(), end_it = paths.end();
it != end_it;
++it)
{
(*it) = gDirUtilp->findSkinnedFilename(*it, base_xml_name);
}
// suck the translation xml files into memory
LLXMLNodePtr root;
bool success = LLXMLNode::getLayeredXMLNode(root, paths);
if (!success)
{
// couldn't load string table XML
return false;
}
else
{
// get those strings out of the XML
LLTrans::parseStrings(root, default_trans_args);
return true;
}
|*==========================================================================*/
}
void updater_app_ui_init(void);
void updater_app_quit(UpdaterAppState *app_state);
void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state);
std::string next_image_filename(std::string& image_path, LLDirIterator& iter);
void display_error(GtkWidget *parent, std::string title, std::string message);
BOOL install_package(std::string package_file, std::string destination);
BOOL spawn_viewer(UpdaterAppState *app_state);
extern "C" {
void on_window_closed(GtkWidget *sender, GdkEvent *event, gpointer state);
gpointer worker_thread_cb(gpointer *data);
int download_progress_cb(gpointer data, double t, double d, double utotal, double ulnow);
gboolean rotate_image_cb(gpointer data);
gboolean progress_update_timeout(gpointer data);
gboolean update_progress_text_timeout(gpointer data);
}
void updater_app_ui_init(UpdaterAppState *app_state)
{
GtkWidget *vbox;
GtkWidget *summary_label;
GtkWidget *description_label;
GtkWidget *frame;
llassert(app_state != NULL);
// set up window and main container
std::string window_title = LLTrans::getString("UpdaterWindowTitle");
app_state->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(app_state->window),
window_title.c_str());
gtk_window_set_resizable(GTK_WINDOW(app_state->window), FALSE);
gtk_window_set_position(GTK_WINDOW(app_state->window),
GTK_WIN_POS_CENTER_ALWAYS);
gtk_container_set_border_width(GTK_CONTAINER(app_state->window), 12);
g_signal_connect(G_OBJECT(app_state->window), "delete-event",
G_CALLBACK(on_window_closed), app_state);
vbox = gtk_vbox_new(FALSE, 6);
gtk_container_add(GTK_CONTAINER(app_state->window), vbox);
// set top label
std::ostringstream label_ostr;
label_ostr << "<big><b>"
<< LLTrans::getString("UpdaterNowUpdating")
<< "</b></big>";
summary_label = gtk_label_new(NULL);
gtk_label_set_use_markup(GTK_LABEL(summary_label), TRUE);
gtk_label_set_markup(GTK_LABEL(summary_label),
label_ostr.str().c_str());
gtk_misc_set_alignment(GTK_MISC(summary_label), 0, 0.5);
gtk_box_pack_start(GTK_BOX(vbox), summary_label, FALSE, FALSE, 0);
// create the description label
description_label = gtk_label_new(LLTrans::getString("UpdaterUpdatingDescriptive").c_str());
gtk_label_set_line_wrap(GTK_LABEL(description_label), TRUE);
gtk_misc_set_alignment(GTK_MISC(description_label), 0, 0.5);
gtk_box_pack_start(GTK_BOX(vbox), description_label, FALSE, FALSE, 0);
// If an image path has been set, load the background images
if (!app_state->image_dir.empty()) {
frame = gtk_frame_new(NULL);
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0);
// load the first image
app_state->image = gtk_image_new_from_file
(next_image_filename(app_state->image_dir, *app_state->image_dir_iter).c_str());
gtk_widget_set_size_request(app_state->image, 340, 310);
gtk_container_add(GTK_CONTAINER(frame), app_state->image);
// rotate the images every 5 seconds
app_state->image_rotation_timeout_id = g_timeout_add
(ROTATE_IMAGE_TIMEOUT, rotate_image_cb, app_state);
}
// set up progress bar, and update it roughly every 1/10 of a second
app_state->progress_bar = gtk_progress_bar_new();
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(app_state->progress_bar),
LLTrans::getString("UpdaterProgressBarTextWithEllipses").c_str());
gtk_box_pack_start(GTK_BOX(vbox),
app_state->progress_bar, FALSE, TRUE, 0);
app_state->progress_update_timeout_id = g_timeout_add
(UPDATE_PROGRESS_TIMEOUT, progress_update_timeout, app_state);
app_state->update_progress_text_timeout_id = g_timeout_add
(UPDATE_PROGRESS_TEXT_TIMEOUT, update_progress_text_timeout, app_state);
gtk_widget_show_all(app_state->window);
}
gboolean rotate_image_cb(gpointer data)
{
UpdaterAppState *app_state;
std::string filename;
llassert(data != NULL);
app_state = (UpdaterAppState *) data;
filename = next_image_filename(app_state->image_dir, *app_state->image_dir_iter);
gdk_threads_enter();
gtk_image_set_from_file(GTK_IMAGE(app_state->image), filename.c_str());
gdk_threads_leave();
return TRUE;
}
std::string next_image_filename(std::string& image_path, LLDirIterator& iter)
{
std::string image_filename;
iter.next(image_filename);
return gDirUtilp->add(image_path, image_filename);
}
void on_window_closed(GtkWidget *sender, GdkEvent* event, gpointer data)
{
UpdaterAppState *app_state;
llassert(data != NULL);
app_state = (UpdaterAppState *) data;
updater_app_quit(app_state);
}
void updater_app_quit(UpdaterAppState *app_state)
{
if (app_state != NULL)
{
g_source_remove(app_state->progress_update_timeout_id);
if (!app_state->image_dir.empty())
{
g_source_remove(app_state->image_rotation_timeout_id);
}
}
gtk_main_quit();
}
void display_error(GtkWidget *parent, std::string title, std::string message)
{
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW(parent),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"%s", message.c_str());
gtk_window_set_title(GTK_WINDOW(dialog), title.c_str());
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
}
gpointer worker_thread_cb(gpointer data)
{
UpdaterAppState *app_state;
CURL *curl;
CURLcode result;
FILE *package_file;
GError *error = NULL;
int fd;
//g_return_val_if_fail (data != NULL, NULL);
app_state = (UpdaterAppState *) data;
try {
if(!app_state->url.empty())
{
char* tmp_local_filename = NULL;
// create temporary file to store the package.
fd = g_file_open_tmp
("secondlife-update-XXXXXX", &tmp_local_filename, &error);
if (error != NULL)
{
LL_ERRS() << "Unable to create temporary file: "
<< error->message
<< LL_ENDL;
g_error_free(error);
throw 0;
}
if(tmp_local_filename != NULL)
{
app_state->file = tmp_local_filename;
g_free(tmp_local_filename);
}
package_file = fdopen(fd, "wb");
if (package_file == NULL)
{
LL_ERRS() << "Failed to create temporary file: "
<< app_state->file.c_str()
<< LL_ENDL;
gdk_threads_enter();
display_error(app_state->window,
LLTrans::getString("UpdaterFailDownloadTitle"),
LLTrans::getString("UpdaterFailUpdateDescriptive"));
gdk_threads_leave();
throw 0;
}
// initialize curl and start downloading the package
LL_INFOS() << "Downloading package: " << app_state->url << LL_ENDL;
curl = curl_easy_init();
if (curl == NULL)
{
LL_ERRS() << "Failed to initialize libcurl" << LL_ENDL;
gdk_threads_enter();
display_error(app_state->window,
LLTrans::getString("UpdaterFailDownloadTitle"),
LLTrans::getString("UpdaterFailUpdateDescriptive"));
gdk_threads_leave();
throw 0;
}
curl_easy_setopt(curl, CURLOPT_URL, app_state->url.c_str());
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, TRUE);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, TRUE);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, package_file);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION,
&download_progress_cb);
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, app_state);
result = curl_easy_perform(curl);
fclose(package_file);
curl_easy_cleanup(curl);
if (result)
{
LL_ERRS() << "Failed to download update: "
<< app_state->url
<< LL_ENDL;
gdk_threads_enter();
display_error(app_state->window,
LLTrans::getString("UpdaterFailDownloadTitle"),
LLTrans::getString("UpdaterFailUpdateDescriptive"));
gdk_threads_leave();
throw 0;
}
}
// now pulse the progres bar back and forth while the package is
// being unpacked
gdk_threads_enter();
std::string installing_msg = LLTrans::getString("UpdaterNowInstalling");
gtk_progress_bar_set_text(
GTK_PROGRESS_BAR(app_state->progress_bar),
installing_msg.c_str());
app_state->activity_mode = TRUE;
gdk_threads_leave();
// *TODO: if the destination is not writable, terminate this
// thread and show file chooser?
if (!install_package(app_state->file.c_str(), app_state->dest_dir))
{
LL_WARNS() << "Failed to install package to destination: "
<< app_state->dest_dir
<< LL_ENDL;
gdk_threads_enter();
display_error(app_state->window,
LLTrans::getString("UpdaterFailInstallTitle"),
LLTrans::getString("UpdaterFailUpdateDescriptive"));
//"Failed to update " + app_state->app_name,
gdk_threads_leave();
throw 0;
}
// try to spawn the new viewer
if (!spawn_viewer(app_state))
{
LL_WARNS() << "Viewer was not installed properly in : "
<< app_state->dest_dir
<< LL_ENDL;
gdk_threads_enter();
display_error(app_state->window,
LLTrans::getString("UpdaterFailStartTitle"),
LLTrans::getString("UpdaterFailUpdateDescriptive"));
gdk_threads_leave();
throw 0;
}
}
catch (...)
{
app_state->failure = TRUE;
}
gdk_threads_enter();
updater_app_quit(app_state);
gdk_threads_leave();
return NULL;
}
gboolean less_anal_gspawnsync(gchar **argv,
gchar **stderr_output,
gint *child_exit_status,
GError **spawn_error)
{
// store current SIGCHLD handler if there is one, replace with default
// handler to make glib happy
struct sigaction sigchld_backup;
struct sigaction sigchld_appease_glib;
sigchld_appease_glib.sa_handler = SIG_DFL;
sigemptyset(&sigchld_appease_glib.sa_mask);
sigchld_appease_glib.sa_flags = 0;
sigaction(SIGCHLD, &sigchld_appease_glib, &sigchld_backup);
gboolean rtn = g_spawn_sync(NULL,
argv,
NULL,
(GSpawnFlags) (G_SPAWN_STDOUT_TO_DEV_NULL),
NULL,
NULL,
NULL,
stderr_output,
child_exit_status,
spawn_error);
// restore SIGCHLD handler
sigaction(SIGCHLD, &sigchld_backup, NULL);
return rtn;
}
// perform a rename, or perform a (prompted) root rename if that fails
int
rename_with_sudo_fallback(const std::string& filename, const std::string& newname)
{
int rtncode = ::rename(filename.c_str(), newname.c_str());
LL_DEBUGS() << "rename result is: " << rtncode << " / " << errno << LL_ENDL;
if (rtncode && (EACCES == errno || EPERM == errno || EXDEV == errno))
{
LL_INFOS() << "Permission problem in rename, or moving between different mount points. Retrying as a mv under a sudo." << LL_ENDL;
// failed due to permissions, try again as a gksudo or kdesu mv wrapper hack
char *sudo_cmd = NULL;
sudo_cmd = g_find_program_in_path("gksudo");
if (!sudo_cmd)
{
sudo_cmd = g_find_program_in_path("kdesu");
}
if (sudo_cmd)
{
char *mv_cmd = NULL;
mv_cmd = g_find_program_in_path("mv");
if (mv_cmd)
{
char *src_string_copy = g_strdup(filename.c_str());
char *dst_string_copy = g_strdup(newname.c_str());
char* argv[] =
{
sudo_cmd,
mv_cmd,
src_string_copy,
dst_string_copy,
NULL
};
gchar *stderr_output = NULL;
gint child_exit_status = 0;
GError *spawn_error = NULL;
if (!less_anal_gspawnsync(argv, &stderr_output,
&child_exit_status, &spawn_error))
{
LL_WARNS() << "Failed to spawn child process: "
<< spawn_error->message
<< LL_ENDL;
}
else if (child_exit_status)
{
LL_WARNS() << "mv command failed: "
<< (stderr_output ? stderr_output : "(no reason given)")
<< LL_ENDL;
}
else
{
// everything looks good, clear the error code
rtncode = 0;
}
g_free(src_string_copy);
g_free(dst_string_copy);
if (spawn_error) g_error_free(spawn_error);
}
}
}
return rtncode;
}
gboolean install_package(std::string package_file, std::string destination)
{
char *tar_cmd = NULL;
std::ostringstream command;
// Find the absolute path to the 'tar' command.
tar_cmd = g_find_program_in_path("tar");
if (!tar_cmd)
{
LL_ERRS() << "`tar' was not found in $PATH" << LL_ENDL;
return FALSE;
}
LL_INFOS() << "Found tar command: " << tar_cmd << LL_ENDL;
// Unpack the tarball in a temporary place first, then move it to
// its final destination
std::string tmp_dest_dir = gDirUtilp->getTempFilename();
if (LLFile::mkdir(tmp_dest_dir, 0744))
{
LL_ERRS() << "Failed to create directory: "
<< destination
<< LL_ENDL;
return FALSE;
}
char *package_file_string_copy = g_strdup(package_file.c_str());
char *tmp_dest_dir_string_copy = g_strdup(tmp_dest_dir.c_str());
gchar *argv[8] = {
tar_cmd,
const_cast<gchar*>("--strip"), const_cast<gchar*>("1"),
const_cast<gchar*>("-xjf"),
package_file_string_copy,
const_cast<gchar*>("-C"), tmp_dest_dir_string_copy,
NULL,
};
LL_INFOS() << "Untarring package: " << package_file << LL_ENDL;
// store current SIGCHLD handler if there is one, replace with default
// handler to make glib happy
struct sigaction sigchld_backup;
struct sigaction sigchld_appease_glib;
sigchld_appease_glib.sa_handler = SIG_DFL;
sigemptyset(&sigchld_appease_glib.sa_mask);
sigchld_appease_glib.sa_flags = 0;
sigaction(SIGCHLD, &sigchld_appease_glib, &sigchld_backup);
gchar *stderr_output = NULL;
gint child_exit_status = 0;
GError *untar_error = NULL;
if (!less_anal_gspawnsync(argv, &stderr_output,
&child_exit_status, &untar_error))
{
LL_WARNS() << "Failed to spawn child process: "
<< untar_error->message
<< LL_ENDL;
return FALSE;
}
if (child_exit_status)
{
LL_WARNS() << "Untar command failed: "
<< (stderr_output ? stderr_output : "(no reason given)")
<< LL_ENDL;
return FALSE;
}
g_free(tar_cmd);
g_free(package_file_string_copy);
g_free(tmp_dest_dir_string_copy);
g_free(stderr_output);
if (untar_error) g_error_free(untar_error);
// move the existing package out of the way if it exists
if (gDirUtilp->fileExists(destination))
{
std::string backup_dir = destination + ".backup";
int oldcounter = 1;
while (gDirUtilp->fileExists(backup_dir))
{
// find a foo.backup.N folder name that isn't taken yet
backup_dir = destination + ".backup." + llformat("%d", oldcounter);
++oldcounter;
}
if (rename_with_sudo_fallback(destination, backup_dir))
{
LL_WARNS() << "Failed to move directory: '"
<< destination << "' -> '" << backup_dir
<< LL_ENDL;
return FALSE;
}
}
// The package has been unpacked in a staging directory, now we just
// need to move it to its destination.
if (rename_with_sudo_fallback(tmp_dest_dir, destination))
{
LL_WARNS() << "Failed to move installation to the destination: "
<< destination
<< LL_ENDL;
return FALSE;
}
// \0/ Success!
return TRUE;
}
gboolean progress_update_timeout(gpointer data)
{
UpdaterAppState *app_state;
llassert(data != NULL);
app_state = (UpdaterAppState *) data;
gdk_threads_enter();
if (app_state->activity_mode)
{
gtk_progress_bar_pulse
(GTK_PROGRESS_BAR(app_state->progress_bar));
}
else
{
gtk_progress_set_value(GTK_PROGRESS(app_state->progress_bar),
app_state->progress_value);
}
gdk_threads_leave();
return TRUE;
}
gboolean update_progress_text_timeout(gpointer data)
{
UpdaterAppState *app_state;
llassert(data != NULL);
app_state = (UpdaterAppState *) data;
if (app_state->activity_mode == TRUE)
{
// We no longer need this timeout, it will be removed.
return FALSE;
}
if (!app_state->progress_value)
{
return TRUE;
}
std::string progress_text = llformat((LLTrans::getString("UpdaterProgressBarText")+" (%.0f%%)").c_str(), app_state->progress_value);
gdk_threads_enter();
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(app_state->progress_bar),
progress_text.c_str());
gdk_threads_leave();
return TRUE;
}
int download_progress_cb(gpointer data,
double t,
double d,
double utotal,
double ulnow)
{
UpdaterAppState *app_state;
llassert(data != NULL);
app_state = (UpdaterAppState *) data;
if (t <= 0.0)
{
app_state->progress_value = 0;
}
else
{
app_state->progress_value = d * 100.0 / t;
}
return 0;
}
BOOL spawn_viewer(UpdaterAppState *app_state)
{
llassert(app_state != NULL);
std::string cmd = app_state->dest_dir + "/secondlife";
GError *error = NULL;
// We want to spawn the Viewer on the same display as the updater app
gboolean success = gdk_spawn_command_line_on_screen
(gtk_widget_get_screen(app_state->window), cmd.c_str(), &error);
if (!success)
{
LL_WARNS() << "Failed to launch viewer: " << error->message
<< LL_ENDL;
}
if (error) g_error_free(error);
return success;
}
void show_usage_and_exit()
{
std::cout << "Usage: linux-updater <--url URL | --file FILE> --name NAME --dest PATH --stringsdir PATH1,PATH2 --stringsfile FILE"
<< "[--image-dir PATH]"
<< std::endl;
exit(1);
}
void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state)
{
int i;
for (i = 1; i < argc; i++)
{
if ((!strcmp(argv[i], "--url")) && (++i < argc))
{
app_state->url = argv[i];
}
else if ((!strcmp(argv[i], "--file")) && (++i < argc))
{
app_state->file = argv[i];
}
else if ((!strcmp(argv[i], "--name")) && (++i < argc))
{
app_state->app_name = argv[i];
}
else if ((!strcmp(argv[i], "--image-dir")) && (++i < argc))
{
app_state->image_dir = argv[i];
app_state->image_dir_iter = new LLDirIterator(argv[i], "*.jpg");
}
else if ((!strcmp(argv[i], "--dest")) && (++i < argc))
{
app_state->dest_dir = argv[i];
}
else if ((!strcmp(argv[i], "--stringsdir")) && (++i < argc))
{
app_state->strings_dirs = argv[i];
}
else if ((!strcmp(argv[i], "--stringsfile")) && (++i < argc))
{
app_state->strings_file = argv[i];
}
else
{
// show usage, an invalid option was given.
show_usage_and_exit();
}
}
if (app_state->app_name.empty()
|| (app_state->url.empty() && app_state->file.empty())
|| app_state->dest_dir.empty())
{
show_usage_and_exit();
}
app_state->progress_value = 0.0;
app_state->activity_mode = FALSE;
app_state->failure = FALSE;
translate_init(app_state->strings_dirs, app_state->strings_file);
}
int main(int argc, char **argv)
{
UpdaterAppState* app_state = new UpdaterAppState;
parse_args_and_init(argc, argv, app_state);
// Initialize logger, and rename old log file
gDirUtilp->initAppDirs("SecondLife");
LLError::initForApplication
(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
std::string old_log_file = gDirUtilp->getExpandedFilename
(LL_PATH_LOGS, "updater.log.old");
std::string log_file =
gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "updater.log");
LLFile::rename(log_file, old_log_file);
LLError::logToFile(log_file);
// initialize gthreads and gtk+
if (!g_thread_supported())
{
g_thread_init(NULL);
gdk_threads_init();
}
gtk_init(&argc, &argv);
// create UI
updater_app_ui_init(app_state);
//LL_INFOS() << "SAMPLE TRANSLATION IS: " << LLTrans::getString("LoginInProgress") << LL_ENDL;
// create download thread
g_thread_create(GThreadFunc(worker_thread_cb), app_state, FALSE, NULL);
gdk_threads_enter();
gtk_main();
gdk_threads_leave();
// Delete the file only if created from url download.
if(!app_state->url.empty() && !app_state->file.empty())
{
if (gDirUtilp->fileExists(app_state->file))
{
LLFile::remove(app_state->file);
}
}
bool success = !app_state->failure;
delete app_state->image_dir_iter;
delete app_state;
return success ? 0 : 1;
}
/*****************************************************************************
* Dummy LLTrans implementation (IQA-490)
*****************************************************************************/
static LLTrans sStaticStrings;
// lookup
std::string LLTrans::_getString(const std::string& key) const
{
MessageMap::const_iterator found = mMessages.find(key);
if (found != mMessages.end())
{
return found->second;
}
LL_WARNS("linux_updater") << "No message for key '" << key
<< "' -- add to LLTrans::LLTrans() in linux_updater.cpp"
<< LL_ENDL;
return key;
}
// static lookup
std::string LLTrans::getString(const std::string& key)
{
return sLLTransInstance._getString(key);
}
// initialization
LLTrans::LLTrans()
{
typedef std::pair<const char*, const char*> Pair;
static const Pair data[] =
{
Pair("UpdaterFailDownloadTitle",
"Failed to download update"),
Pair("UpdaterFailInstallTitle",
"Failed to install update"),
Pair("UpdaterFailStartTitle",
"Failed to start viewer"),
Pair("UpdaterFailUpdateDescriptive",
"An error occurred while updating Second Life. "
"Please download the latest version from www.secondlife.com."),
Pair("UpdaterNowInstalling",
"Installing Second Life..."),
Pair("UpdaterNowUpdating",
"Now updating Second Life..."),
Pair("UpdaterProgressBarText",
"Downloading update"),
Pair("UpdaterProgressBarTextWithEllipses",
"Downloading update..."),
Pair("UpdaterUpdatingDescriptive",
"Your Second Life Viewer is being updated to the latest release. "
"This may take some time, so please be patient."),
Pair("UpdaterWindowTitle",
"Second Life Update")
};
BOOST_FOREACH(Pair pair, data)
{
mMessages[pair.first] = pair.second;
}
}

View File

@ -24,7 +24,7 @@
*/
#ifndef LL_LLAUDIODECODEMGR_H
#define LL_LLAUDIODECODEMG_H
#define LL_LLAUDIODECODEMGR_H
#include "stdtypes.h"

File diff suppressed because it is too large Load Diff

View File

@ -28,26 +28,26 @@
#include "linden_common.h"
#if defined(LL_DARWIN)
#include <QuickTime/QuickTime.h>
#elif defined(LL_WINDOWS)
#include "llwin32headers.h"
#include "MacTypes.h"
#include "QTML.h"
#include "Movies.h"
#include "QDoffscreen.h"
#include "FixMath.h"
#include "QTLoadLibraryUtils.h"
#endif
#include "llgl.h"
#include "llplugininstance.h"
#include "llpluginmessage.h"
#include "llpluginmessageclasses.h"
#include "media_plugin_base.h"
#if LL_QUICKTIME_ENABLED
#if defined(LL_DARWIN)
#include <QuickTime/QuickTime.h>
#elif defined(LL_WINDOWS)
#include "llwin32headers.h"
#include "MacTypes.h"
#include "QTML.h"
#include "Movies.h"
#include "QDoffscreen.h"
#include "FixMath.h"
#include "QTLoadLibraryUtils.h"
#endif

View File

@ -1769,7 +1769,6 @@ if (WINDOWS)
media_plugin_webkit
winmm_shim
windows-crash-logger
windows-updater
)
if (FMODEX)
@ -1815,7 +1814,6 @@ if (WINDOWS)
add_dependencies(${VIEWER_BINARY_NAME}
SLPlugin
windows-updater
windows-crash-logger
)

View File

@ -1 +1 @@
3.7.15
3.7.16

View File

@ -1,19 +1,5 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.01</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>contrast</string>
<real>0.8</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>grayscale</string>
</array>

View File

@ -1,30 +1,5 @@
<llsd>
<array>
<array>
<string>linearize</string>
<real>0.01</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>contrast</string>
<real>0.8</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
<array>
<string>stencil</string>
<string>vignette</string>
<string>fade</string>
<real>0.5</real>
<real>1.0</real>
<real>0.0</real>
<real>0.0</real>
<real>1.0</real>
<real>4.0</real>
</array>
<array>
<string>sepia</string>
</array>

View File

@ -80,7 +80,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
<integer>1</integer>
</map>
<key>AgentPause</key>
<map>
@ -11463,17 +11463,6 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>SnapshotFiltersEnabled</key>
<map>
<key>Comment</key>
<string>Enable filters in the Snapshot Advanced panel (experimental).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SnapshotFormat</key>
<map>
<key>Comment</key>

View File

@ -58,7 +58,6 @@ static LLPanelInjector<LLFacebookStatusPanel> t_panel_status("llfacebookstatuspa
static LLPanelInjector<LLFacebookPhotoPanel> t_panel_photo("llfacebookphotopanel");
static LLPanelInjector<LLFacebookCheckinPanel> t_panel_checkin("llfacebookcheckinpanel");
static LLPanelInjector<LLFacebookFriendsPanel> t_panel_friends("llfacebookfriendspanel");
static LLPanelInjector<LLFacebookAccountPanel> t_panel_account("llfacebookaccountpanel");
const S32 MAX_POSTCARD_DATASIZE = 1024 * 1024; // one megabyte
const std::string DEFAULT_CHECKIN_LOCATION_URL = "http://maps.secondlife.com/";
@ -99,13 +98,29 @@ S32 compute_jpeg_quality(S32 width, S32 height)
LLFacebookStatusPanel::LLFacebookStatusPanel() :
mMessageTextEditor(NULL),
mPostButton(NULL),
mCancelButton(NULL)
mCancelButton(NULL),
mAccountCaptionLabel(NULL),
mAccountNameLabel(NULL),
mPanelButtons(NULL),
mConnectButton(NULL),
mDisconnectButton(NULL)
{
mCommitCallbackRegistrar.add("SocialSharing.Connect", boost::bind(&LLFacebookStatusPanel::onConnect, this));
mCommitCallbackRegistrar.add("SocialSharing.Disconnect", boost::bind(&LLFacebookStatusPanel::onDisconnect, this));
setVisibleCallback(boost::bind(&LLFacebookStatusPanel::onVisibilityChange, this, _2));
mCommitCallbackRegistrar.add("SocialSharing.SendStatus", boost::bind(&LLFacebookStatusPanel::onSend, this));
}
BOOL LLFacebookStatusPanel::postBuild()
{
mAccountCaptionLabel = getChild<LLTextBox>("account_caption_label");
mAccountNameLabel = getChild<LLTextBox>("account_name_label");
mPanelButtons = getChild<LLUICtrl>("panel_buttons");
mConnectButton = getChild<LLUICtrl>("connect_btn");
mDisconnectButton = getChild<LLUICtrl>("disconnect_btn");
mMessageTextEditor = getChild<LLUICtrl>("status_message");
mPostButton = getChild<LLUICtrl>("post_status_btn");
mCancelButton = getChild<LLUICtrl>("cancel_status_btn");
@ -115,6 +130,16 @@ BOOL LLFacebookStatusPanel::postBuild()
void LLFacebookStatusPanel::draw()
{
LLFacebookConnect::EConnectionState connection_state = LLFacebookConnect::instance().getConnectionState();
//Disable the 'disconnect' button and the 'use another account' button when disconnecting in progress
bool disconnecting = connection_state == LLFacebookConnect::FB_DISCONNECTING;
mDisconnectButton->setEnabled(!disconnecting);
//Disable the 'connect' button when a connection is in progress
bool connecting = connection_state == LLFacebookConnect::FB_CONNECTION_IN_PROGRESS;
mConnectButton->setEnabled(!connecting);
if (mMessageTextEditor && mPostButton && mCancelButton)
{
bool no_ongoing_connection = !(LLFacebookConnect::instance().isTransactionOngoing());
@ -131,7 +156,7 @@ void LLFacebookStatusPanel::onSend()
{
LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLFacebookStatusPanel"); // just in case it is already listening
LLEventPumps::instance().obtain("FacebookConnectState").listen("LLFacebookStatusPanel", boost::bind(&LLFacebookStatusPanel::onFacebookConnectStateChange, this, _1));
// Connect to Facebook if necessary and then post
if (LLFacebookConnect::instance().isConnected())
{
@ -160,6 +185,24 @@ bool LLFacebookStatusPanel::onFacebookConnectStateChange(const LLSD& data)
return false;
}
bool LLFacebookStatusPanel::onFacebookConnectAccountStateChange(const LLSD& data)
{
if(LLFacebookConnect::instance().isConnected())
{
//In process of disconnecting so leave the layout as is
if(data.get("enum").asInteger() != LLFacebookConnect::FB_DISCONNECTING)
{
showConnectedLayout();
}
}
else
{
showDisconnectedLayout();
}
return false;
}
void LLFacebookStatusPanel::sendStatus()
{
std::string message = mMessageTextEditor->getValue().asString();
@ -169,6 +212,103 @@ void LLFacebookStatusPanel::sendStatus()
}
}
void LLFacebookStatusPanel::onVisibilityChange(BOOL visible)
{
if(visible)
{
LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLFacebookAccountPanel");
LLEventPumps::instance().obtain("FacebookConnectState").listen("LLFacebookAccountPanel", boost::bind(&LLFacebookStatusPanel::onFacebookConnectAccountStateChange, this, _1));
LLEventPumps::instance().obtain("FacebookConnectInfo").stopListening("LLFacebookAccountPanel");
LLEventPumps::instance().obtain("FacebookConnectInfo").listen("LLFacebookAccountPanel", boost::bind(&LLFacebookStatusPanel::onFacebookConnectInfoChange, this));
//Connected
if(LLFacebookConnect::instance().isConnected())
{
showConnectedLayout();
}
//Check if connected (show disconnected layout in meantime)
else
{
showDisconnectedLayout();
}
if ((LLFacebookConnect::instance().getConnectionState() == LLFacebookConnect::FB_NOT_CONNECTED) ||
(LLFacebookConnect::instance().getConnectionState() == LLFacebookConnect::FB_CONNECTION_FAILED))
{
LLFacebookConnect::instance().checkConnectionToFacebook();
}
}
else
{
LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLFacebookAccountPanel");
LLEventPumps::instance().obtain("FacebookConnectInfo").stopListening("LLFacebookAccountPanel");
}
}
bool LLFacebookStatusPanel::onFacebookConnectInfoChange()
{
LLSD info = LLFacebookConnect::instance().getInfo();
std::string clickable_name;
//Strings of format [http://www.somewebsite.com Click Me] become clickable text
if(info.has("link") && info.has("name"))
{
clickable_name = "[" + info["link"].asString() + " " + info["name"].asString() + "]";
}
mAccountNameLabel->setText(clickable_name);
return false;
}
void LLFacebookStatusPanel::showConnectButton()
{
if(!mConnectButton->getVisible())
{
mConnectButton->setVisible(TRUE);
mDisconnectButton->setVisible(FALSE);
}
}
void LLFacebookStatusPanel::hideConnectButton()
{
if(mConnectButton->getVisible())
{
mConnectButton->setVisible(FALSE);
mDisconnectButton->setVisible(TRUE);
}
}
void LLFacebookStatusPanel::showDisconnectedLayout()
{
mAccountCaptionLabel->setText(getString("facebook_disconnected"));
mAccountNameLabel->setText(std::string(""));
showConnectButton();
}
void LLFacebookStatusPanel::showConnectedLayout()
{
LLFacebookConnect::instance().loadFacebookInfo();
mAccountCaptionLabel->setText(getString("facebook_connected"));
hideConnectButton();
}
void LLFacebookStatusPanel::onConnect()
{
LLFacebookConnect::instance().checkConnectionToFacebook(true);
//Clear only the facebook browser cookies so that the facebook login screen appears
LLViewerMedia::getCookieStore()->removeCookiesByDomain(".facebook.com");
}
void LLFacebookStatusPanel::onDisconnect()
{
LLFacebookConnect::instance().disconnectFromFacebook();
LLViewerMedia::getCookieStore()->removeCookiesByDomain(".facebook.com");
}
void LLFacebookStatusPanel::clearAndClose()
{
mMessageTextEditor->setValue("");
@ -185,7 +325,6 @@ void LLFacebookStatusPanel::clearAndClose()
///////////////////////////
LLFacebookPhotoPanel::LLFacebookPhotoPanel() :
mSnapshotPanel(NULL),
mResolutionComboBox(NULL),
mRefreshBtn(NULL),
mBtnPreview(NULL),
@ -213,7 +352,6 @@ BOOL LLFacebookPhotoPanel::postBuild()
{
setVisibleCallback(boost::bind(&LLFacebookPhotoPanel::onVisibilityChange, this, _2));
mSnapshotPanel = getChild<LLUICtrl>("snapshot_panel");
mResolutionComboBox = getChild<LLUICtrl>("resolution_combobox");
mResolutionComboBox->setValue("[i1200,i630]"); // hardcoded defaults ftw!
mResolutionComboBox->setCommitCallback(boost::bind(&LLFacebookPhotoPanel::updateResolution, this, TRUE));
@ -300,16 +438,9 @@ void LLFacebookPhotoPanel::draw()
// calc preview offset within the preview rect
const S32 local_offset_x = (thumbnail_rect.getWidth() - thumbnail_w) / 2 ;
const S32 local_offset_y = (thumbnail_rect.getHeight() - thumbnail_h) / 2 ;
S32 offset_x = thumbnail_rect.mLeft + local_offset_x;
S32 offset_y = thumbnail_rect.mBottom + local_offset_y;
// calc preview offset within the floater rect
// Hack : To get the full offset, we need to take into account each and every offset of each widgets up to the floater.
// This is almost as arbitrary as using a fixed offset so that's what we do here for the sake of simplicity.
// *TODO : Get the offset looking through the hierarchy of widgets, should be done in postBuild() so to avoid traversing the hierarchy each time.
S32 offset_x = thumbnail_rect.mLeft + local_offset_x - 1;
S32 offset_y = thumbnail_rect.mBottom + local_offset_y - 39;
mSnapshotPanel->localPointToOtherView(offset_x, offset_y, &offset_x, &offset_y, getParentByType<LLFloater>());
gGL.matrixMode(LLRender::MM_MODELVIEW);
// Apply floater transparency to the texture unless the floater is focused.
F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
@ -344,7 +475,7 @@ void LLFacebookPhotoPanel::onVisibilityChange(BOOL visible)
LLSnapshotLivePreview* preview = getPreviewView();
if(preview)
{
lldebugs << "opened, updating snapshot" << llendl;
LL_DEBUGS() << "opened, updating snapshot" << LL_ENDL;
preview->updateSnapshot(TRUE);
}
}
@ -477,7 +608,7 @@ void LLFacebookPhotoPanel::updateControls()
BOOL got_snap = previewp && previewp->getSnapshotUpToDate();
// *TODO: Separate maximum size for Web images from postcards
lldebugs << "Is snapshot up-to-date? " << got_snap << llendl;
LL_DEBUGS() << "Is snapshot up-to-date? " << got_snap << LL_ENDL;
updateResolution(FALSE);
}
@ -507,13 +638,13 @@ void LLFacebookPhotoPanel::updateResolution(BOOL do_update)
if (width == 0 || height == 0)
{
// take resolution from current window size
lldebugs << "Setting preview res from window: " << gViewerWindow->getWindowWidthRaw() << "x" << gViewerWindow->getWindowHeightRaw() << llendl;
LL_DEBUGS() << "Setting preview res from window: " << gViewerWindow->getWindowWidthRaw() << "x" << gViewerWindow->getWindowHeightRaw() << LL_ENDL;
previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
}
else
{
// use the resolution from the selected pre-canned drop-down choice
lldebugs << "Setting preview res selected from combo: " << width << "x" << height << llendl;
LL_DEBUGS() << "Setting preview res selected from combo: " << width << "x" << height << LL_ENDL;
previewp->setSize(width, height);
}
@ -887,164 +1018,6 @@ bool LLFacebookFriendsPanel::onConnectedToFacebook(const LLSD& data)
return false;
}
///////////////////////////
//LLFacebookAccountPanel//////
///////////////////////////
LLFacebookAccountPanel::LLFacebookAccountPanel() :
mAccountCaptionLabel(NULL),
mAccountNameLabel(NULL),
mPanelButtons(NULL),
mConnectButton(NULL),
mDisconnectButton(NULL)
{
mCommitCallbackRegistrar.add("SocialSharing.Connect", boost::bind(&LLFacebookAccountPanel::onConnect, this));
mCommitCallbackRegistrar.add("SocialSharing.Disconnect", boost::bind(&LLFacebookAccountPanel::onDisconnect, this));
setVisibleCallback(boost::bind(&LLFacebookAccountPanel::onVisibilityChange, this, _2));
}
BOOL LLFacebookAccountPanel::postBuild()
{
mAccountCaptionLabel = getChild<LLTextBox>("account_caption_label");
mAccountNameLabel = getChild<LLTextBox>("account_name_label");
mPanelButtons = getChild<LLUICtrl>("panel_buttons");
mConnectButton = getChild<LLUICtrl>("connect_btn");
mDisconnectButton = getChild<LLUICtrl>("disconnect_btn");
return LLPanel::postBuild();
}
void LLFacebookAccountPanel::draw()
{
LLFacebookConnect::EConnectionState connection_state = LLFacebookConnect::instance().getConnectionState();
//Disable the 'disconnect' button and the 'use another account' button when disconnecting in progress
bool disconnecting = connection_state == LLFacebookConnect::FB_DISCONNECTING;
mDisconnectButton->setEnabled(!disconnecting);
//Disable the 'connect' button when a connection is in progress
bool connecting = connection_state == LLFacebookConnect::FB_CONNECTION_IN_PROGRESS;
mConnectButton->setEnabled(!connecting);
LLPanel::draw();
}
void LLFacebookAccountPanel::onVisibilityChange(BOOL visible)
{
if(visible)
{
LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLFacebookAccountPanel");
LLEventPumps::instance().obtain("FacebookConnectState").listen("LLFacebookAccountPanel", boost::bind(&LLFacebookAccountPanel::onFacebookConnectStateChange, this, _1));
LLEventPumps::instance().obtain("FacebookConnectInfo").stopListening("LLFacebookAccountPanel");
LLEventPumps::instance().obtain("FacebookConnectInfo").listen("LLFacebookAccountPanel", boost::bind(&LLFacebookAccountPanel::onFacebookConnectInfoChange, this));
//Connected
if(LLFacebookConnect::instance().isConnected())
{
showConnectedLayout();
}
//Check if connected (show disconnected layout in meantime)
else
{
showDisconnectedLayout();
}
if ((LLFacebookConnect::instance().getConnectionState() == LLFacebookConnect::FB_NOT_CONNECTED) ||
(LLFacebookConnect::instance().getConnectionState() == LLFacebookConnect::FB_CONNECTION_FAILED))
{
LLFacebookConnect::instance().checkConnectionToFacebook();
}
}
else
{
LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLFacebookAccountPanel");
LLEventPumps::instance().obtain("FacebookConnectInfo").stopListening("LLFacebookAccountPanel");
}
}
bool LLFacebookAccountPanel::onFacebookConnectStateChange(const LLSD& data)
{
if(LLFacebookConnect::instance().isConnected())
{
//In process of disconnecting so leave the layout as is
if(data.get("enum").asInteger() != LLFacebookConnect::FB_DISCONNECTING)
{
showConnectedLayout();
}
}
else
{
showDisconnectedLayout();
}
return false;
}
bool LLFacebookAccountPanel::onFacebookConnectInfoChange()
{
LLSD info = LLFacebookConnect::instance().getInfo();
std::string clickable_name;
//Strings of format [http://www.somewebsite.com Click Me] become clickable text
if(info.has("link") && info.has("name"))
{
clickable_name = "[" + info["link"].asString() + " " + info["name"].asString() + "]";
}
mAccountNameLabel->setText(clickable_name);
return false;
}
void LLFacebookAccountPanel::showConnectButton()
{
if(!mConnectButton->getVisible())
{
mConnectButton->setVisible(TRUE);
mDisconnectButton->setVisible(FALSE);
}
}
void LLFacebookAccountPanel::hideConnectButton()
{
if(mConnectButton->getVisible())
{
mConnectButton->setVisible(FALSE);
mDisconnectButton->setVisible(TRUE);
}
}
void LLFacebookAccountPanel::showDisconnectedLayout()
{
mAccountCaptionLabel->setText(getString("facebook_disconnected"));
mAccountNameLabel->setText(std::string(""));
showConnectButton();
}
void LLFacebookAccountPanel::showConnectedLayout()
{
LLFacebookConnect::instance().loadFacebookInfo();
mAccountCaptionLabel->setText(getString("facebook_connected"));
hideConnectButton();
}
void LLFacebookAccountPanel::onConnect()
{
LLFacebookConnect::instance().checkConnectionToFacebook(true);
//Clear only the facebook browser cookies so that the facebook login screen appears
LLViewerMedia::getCookieStore()->removeCookiesByDomain(".facebook.com");
}
void LLFacebookAccountPanel::onDisconnect()
{
LLFacebookConnect::instance().disconnectFromFacebook();
LLViewerMedia::getCookieStore()->removeCookiesByDomain(".facebook.com");
}
////////////////////////
//LLFloaterFacebook///////
////////////////////////
@ -1094,7 +1067,7 @@ void LLFloaterFacebook::showPhotoPanel()
LLTabContainer* parent = dynamic_cast<LLTabContainer*>(mFacebookPhotoPanel->getParent());
if (!parent)
{
llwarns << "Cannot find panel container" << llendl;
LL_WARNS() << "Cannot find panel container" << LL_ENDL;
return;
}

View File

@ -46,11 +46,28 @@ public:
void draw();
void onSend();
bool onFacebookConnectStateChange(const LLSD& data);
bool onFacebookConnectAccountStateChange(const LLSD& data);
void sendStatus();
void clearAndClose();
private:
void onVisibilityChange(BOOL new_visibility);
bool onFacebookConnectInfoChange();
void onConnect();
void onUseAnotherAccount();
void onDisconnect();
void showConnectButton();
void hideConnectButton();
void showDisconnectedLayout();
void showConnectedLayout();
LLTextBox * mAccountCaptionLabel;
LLTextBox * mAccountNameLabel;
LLUICtrl * mPanelButtons;
LLUICtrl * mConnectButton;
LLUICtrl * mDisconnectButton;
LLUICtrl* mMessageTextEditor;
LLUICtrl* mPostButton;
LLUICtrl* mCancelButton;
@ -87,7 +104,6 @@ private:
LLHandle<LLView> mPreviewHandle;
LLUICtrl * mSnapshotPanel;
LLUICtrl * mResolutionComboBox;
LLUICtrl * mFilterComboBox;
LLUICtrl * mRefreshBtn;
@ -147,33 +163,6 @@ private:
LLAvatarList* mSuggestedFriends;
};
class LLFacebookAccountPanel : public LLPanel
{
public:
LLFacebookAccountPanel();
BOOL postBuild();
void draw();
private:
void onVisibilityChange(BOOL new_visibility);
bool onFacebookConnectStateChange(const LLSD& data);
bool onFacebookConnectInfoChange();
void onConnect();
void onUseAnotherAccount();
void onDisconnect();
void showConnectButton();
void hideConnectButton();
void showDisconnectedLayout();
void showConnectedLayout();
LLTextBox * mAccountCaptionLabel;
LLTextBox * mAccountNameLabel;
LLUICtrl * mPanelButtons;
LLUICtrl * mConnectButton;
LLUICtrl * mDisconnectButton;
};
class LLFloaterFacebook : public LLFloater
{
public:

View File

@ -65,7 +65,6 @@ const std::string FLICKR_MACHINE_TAGS_NAMESPACE = "secondlife";
///////////////////////////
LLFlickrPhotoPanel::LLFlickrPhotoPanel() :
mSnapshotPanel(NULL),
mResolutionComboBox(NULL),
mRefreshBtn(NULL),
mBtnPreview(NULL),
@ -96,7 +95,6 @@ BOOL LLFlickrPhotoPanel::postBuild()
{
setVisibleCallback(boost::bind(&LLFlickrPhotoPanel::onVisibilityChange, this, _2));
mSnapshotPanel = getChild<LLUICtrl>("snapshot_panel");
mResolutionComboBox = getChild<LLUICtrl>("resolution_combobox");
mResolutionComboBox->setCommitCallback(boost::bind(&LLFlickrPhotoPanel::updateResolution, this, TRUE));
mFilterComboBox = getChild<LLUICtrl>("filters_combobox");
@ -191,16 +189,9 @@ void LLFlickrPhotoPanel::draw()
// calc preview offset within the preview rect
const S32 local_offset_x = (thumbnail_rect.getWidth() - thumbnail_w) / 2 ;
const S32 local_offset_y = (thumbnail_rect.getHeight() - thumbnail_h) / 2 ;
S32 offset_x = thumbnail_rect.mLeft + local_offset_x;
S32 offset_y = thumbnail_rect.mBottom + local_offset_y;
// calc preview offset within the floater rect
// Hack : To get the full offset, we need to take into account each and every offset of each widgets up to the floater.
// This is almost as arbitrary as using a fixed offset so that's what we do here for the sake of simplicity.
// *TODO : Get the offset looking through the hierarchy of widgets, should be done in postBuild() so to avoid traversing the hierarchy each time.
S32 offset_x = thumbnail_rect.mLeft + local_offset_x - 1;
S32 offset_y = thumbnail_rect.mBottom + local_offset_y - 39;
mSnapshotPanel->localPointToOtherView(offset_x, offset_y, &offset_x, &offset_y, getParentByType<LLFloater>());
gGL.matrixMode(LLRender::MM_MODELVIEW);
// Apply floater transparency to the texture unless the floater is focused.
F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
@ -235,7 +226,7 @@ void LLFlickrPhotoPanel::onVisibilityChange(BOOL visible)
LLSnapshotLivePreview* preview = getPreviewView();
if(preview)
{
lldebugs << "opened, updating snapshot" << llendl;
LL_DEBUGS() << "opened, updating snapshot" << LL_ENDL;
preview->updateSnapshot(TRUE);
}
}
@ -427,7 +418,7 @@ void LLFlickrPhotoPanel::updateControls()
BOOL got_snap = previewp && previewp->getSnapshotUpToDate();
// *TODO: Separate maximum size for Web images from postcards
lldebugs << "Is snapshot up-to-date? " << got_snap << llendl;
LL_DEBUGS() << "Is snapshot up-to-date? " << got_snap << LL_ENDL;
updateResolution(FALSE);
}
@ -457,13 +448,13 @@ void LLFlickrPhotoPanel::updateResolution(BOOL do_update)
if (width == 0 || height == 0)
{
// take resolution from current window size
lldebugs << "Setting preview res from window: " << gViewerWindow->getWindowWidthRaw() << "x" << gViewerWindow->getWindowHeightRaw() << llendl;
LL_DEBUGS() << "Setting preview res from window: " << gViewerWindow->getWindowWidthRaw() << "x" << gViewerWindow->getWindowHeightRaw() << LL_ENDL;
previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
}
else
{
// use the resolution from the selected pre-canned drop-down choice
lldebugs << "Setting preview res selected from combo: " << width << "x" << height << llendl;
LL_DEBUGS() << "Setting preview res selected from combo: " << width << "x" << height << LL_ENDL;
previewp->setSize(width, height);
}
@ -726,7 +717,7 @@ void LLFloaterFlickr::showPhotoPanel()
LLTabContainer* parent = dynamic_cast<LLTabContainer*>(mFlickrPhotoPanel->getParent());
if (!parent)
{
llwarns << "Cannot find panel container" << llendl;
LL_WARNS() << "Cannot find panel container" << LL_ENDL;
return;
}

View File

@ -67,7 +67,6 @@ private:
LLHandle<LLView> mPreviewHandle;
LLUICtrl * mSnapshotPanel;
LLUICtrl * mResolutionComboBox;
LLUICtrl * mFilterComboBox;
LLUICtrl * mRefreshBtn;

View File

@ -1517,6 +1517,8 @@ void LLPanelLandObjects::onClickRefresh(void* userdata)
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
if (!region) return;
self->mBtnRefresh->setEnabled(false);
// ready the list for results
self->mOwnerList->deleteAllItems();
self->mOwnerList->setCommentText(LLTrans::getString("Searching"));
@ -1576,6 +1578,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo
{
msg->getU32("DataExtended", "TimeStamp", most_recent_time, i);
}
if (owner_id.isNull())
{
continue;
@ -1611,10 +1614,10 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo
item_params.columns.add().value(LLDate((time_t)most_recent_time)).font(FONT).column("mostrecent").type("date");
self->mOwnerList->addNameItemRow(item_params);
LL_DEBUGS() << "object owner " << owner_id << " (" << (is_group_owned ? "group" : "agent")
<< ") owns " << object_count << " objects." << LL_ENDL;
}
// check for no results
if (0 == self->mOwnerList->getItemCount())
{
@ -1624,6 +1627,8 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo
{
self->mOwnerList->setEnabled(TRUE);
}
self->mBtnRefresh->setEnabled(true);
}
// static

View File

@ -481,6 +481,17 @@ void LLFloaterRegionInfo::refresh()
}
}
void LLFloaterRegionInfo::enableTopButtons()
{
getChildView("top_colliders_btn")->setEnabled(true);
getChildView("top_scripts_btn")->setEnabled(true);
}
void LLFloaterRegionInfo::disableTopButtons()
{
getChildView("top_colliders_btn")->setEnabled(false);
getChildView("top_scripts_btn")->setEnabled(false);
}
///----------------------------------------------------------------------------
/// Local class implementation
@ -1033,6 +1044,11 @@ void LLPanelRegionDebugInfo::onClickTopColliders(void* data)
if(!instance) return;
LLFloaterReg::showInstance("top_objects");
instance->clearList();
instance->disableRefreshBtn();
self->getChildView("top_colliders_btn")->setEnabled(false);
self->getChildView("top_scripts_btn")->setEnabled(false);
self->sendEstateOwnerMessage(gMessageSystem, "colliders", invoice, strings);
}
@ -1047,6 +1063,11 @@ void LLPanelRegionDebugInfo::onClickTopScripts(void* data)
if(!instance) return;
LLFloaterReg::showInstance("top_objects");
instance->clearList();
instance->disableRefreshBtn();
self->getChildView("top_colliders_btn")->setEnabled(false);
self->getChildView("top_scripts_btn")->setEnabled(false);
self->sendEstateOwnerMessage(gMessageSystem, "scripts", invoice, strings);
}

View File

@ -96,6 +96,8 @@ public:
void requestRegionInfo();
void requestMeshRezInfo();
void enableTopButtons();
void disableTopButtons();
private:

View File

@ -62,7 +62,6 @@ const S32 MAX_TEXTURE_SIZE = 512 ; //max upload texture size 512 * 512
static LLDefaultChildRegistry::Register<LLSnapshotFloaterView> r("snapshot_floater_view");
///----------------------------------------------------------------------------
/// Class LLFloaterSnapshot::Impl
///----------------------------------------------------------------------------
@ -96,7 +95,6 @@ public:
static void onClickAutoSnap(LLUICtrl *ctrl, void* data);
static void onClickFilter(LLUICtrl *ctrl, void* data);
//static void onClickAdvanceSnap(LLUICtrl *ctrl, void* data);
static void onClickMore(void* data) ;
static void onClickUICheck(LLUICtrl *ctrl, void* data);
static void onClickHUDCheck(LLUICtrl *ctrl, void* data);
static void applyKeepAspectCheck(LLFloaterSnapshot* view, BOOL checked);
@ -264,29 +262,34 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
BOOL advanced = gSavedSettings.getBOOL("AdvanceSnapshot");
// Show/hide advanced options.
LLPanel* advanced_options_panel = floaterp->getChild<LLPanel>("advanced_options_panel");
floaterp->getChild<LLButton>("advanced_options_btn")->setImageOverlay(advanced ? "TabIcon_Open_Off" : "TabIcon_Close_Off");
if (advanced != advanced_options_panel->getVisible())
//BD - Automatically calculate the size of our snapshot window to enlarge
// the snapshot preview to its maximum size, this is especially helpfull
// for pretty much every aspect ratio other than 1:1.
F32 panel_width = 400.f * gViewerWindow->getWorldViewAspectRatio();
//BD - Make sure we clamp at 700 here because 700 would be for 16:9 which we
// consider the maximum. Everything bigger will be clamped and will have
// a slightly smaller preview window which most likely won't fill up the
// whole snapshot floater as it should.
if(panel_width > 700.f)
{
S32 panel_width = advanced_options_panel->getRect().getWidth();
floaterp->getChild<LLPanel>("advanced_options_panel")->setVisible(advanced);
S32 floater_width = floaterp->getRect().getWidth();
floater_width += (advanced ? panel_width : -panel_width);
floaterp->reshape(floater_width, floaterp->getRect().getHeight());
panel_width = 700.f;
}
if(!advanced) //set to original window resolution
S32 floater_width = 224.f;
if(advanced)
{
previewp->mKeepAspectRatio = TRUE;
floater_width = floater_width + panel_width;
}
floaterp->getChild<LLComboBox>("profile_size_combo")->setCurrentByIndex(0);
floaterp->getChild<LLComboBox>("postcard_size_combo")->setCurrentByIndex(0);
floaterp->getChild<LLComboBox>("texture_size_combo")->setCurrentByIndex(0);
floaterp->getChild<LLComboBox>("local_size_combo")->setCurrentByIndex(0);
LLSnapshotLivePreview* previewp = getPreviewView(floaterp);
previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
LLUICtrl* thumbnail_placeholder = floaterp->getChild<LLUICtrl>("thumbnail_placeholder");
thumbnail_placeholder->setVisible(advanced);
thumbnail_placeholder->reshape(panel_width, thumbnail_placeholder->getRect().getHeight());
floaterp->getChild<LLUICtrl>("image_res_text")->setVisible(advanced);
floaterp->getChild<LLUICtrl>("file_size_label")->setVisible(advanced);
if(!floaterp->isMinimized())
{
floaterp->reshape(floater_width, floaterp->getRect().getHeight());
}
bool use_freeze_frame = floaterp->getChild<LLUICtrl>("freeze_frame_check")->getValue().asBoolean();
@ -388,7 +391,7 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
height_ctrl->setValue(h);
}
// Сlamp snapshot resolution to window size when showing UI or HUD in snapshot.
// Clamp snapshot resolution to window size when showing UI or HUD in snapshot.
if (gSavedSettings.getBOOL("RenderUIInSnapshot") || gSavedSettings.getBOOL("RenderHUDInSnapshot"))
{
S32 width = gViewerWindow->getWindowWidthRaw();
@ -576,25 +579,11 @@ void LLFloaterSnapshot::Impl::onClickFilter(LLUICtrl *ctrl, void* data)
LLComboBox* filterbox = static_cast<LLComboBox *>(view->getChild<LLComboBox>("filters_combobox"));
std::string filter_name = (filterbox->getCurrentIndex() ? filterbox->getSimple() : "");
previewp->setFilter(filter_name);
previewp->updateSnapshot(FALSE, TRUE);
previewp->updateSnapshot(TRUE);
}
}
}
void LLFloaterSnapshot::Impl::onClickMore(void* data)
{
BOOL visible = gSavedSettings.getBOOL("AdvanceSnapshot");
LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
if (view)
{
view->impl.setStatus(Impl::STATUS_READY);
gSavedSettings.setBOOL("AdvanceSnapshot", !visible);
updateControls(view) ;
updateLayout(view) ;
}
}
// static
void LLFloaterSnapshot::Impl::onClickUICheck(LLUICtrl *ctrl, void* data)
{
@ -772,6 +761,12 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL
S32 original_width = 0 , original_height = 0 ;
previewp->getSize(original_width, original_height) ;
if (gSavedSettings.getBOOL("RenderUIInSnapshot") || gSavedSettings.getBOOL("RenderHUDInSnapshot"))
{ //clamp snapshot resolution to window size when showing UI or HUD in snapshot
width = llmin(width, gViewerWindow->getWindowWidthRaw());
height = llmin(height, gViewerWindow->getWindowHeightRaw());
}
if (width == 0 || height == 0)
{
// take resolution from current window size
@ -817,14 +812,12 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL
checkAspectRatio(view, width) ;
previewp->getSize(width, height);
if (gSavedSettings.getBOOL("RenderUIInSnapshot") || gSavedSettings.getBOOL("RenderHUDInSnapshot"))
{ //clamp snapshot resolution to window size when showing UI or HUD in snapshot
width = llmin(width, gViewerWindow->getWindowWidthRaw());
height = llmin(height, gViewerWindow->getWindowHeightRaw());
}
updateSpinners(view, previewp, width, height, TRUE); // may change width and height
// We use the height spinner here because we come here via the aspect ratio
// checkbox as well and we want height always changing to width by default.
// If we use the width spinner we would change width according to height by
// default, that is not what we want.
updateSpinners(view, previewp, width, height, !getHeightSpinner(view)->isDirty()); // may change width and height
if(getWidthSpinner(view)->getValue().asInteger() != width || getHeightSpinner(view)->getValue().asInteger() != height)
{
@ -839,12 +832,11 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL
// hide old preview as the aspect ratio could be wrong
checkAutoSnapshot(previewp, FALSE);
LL_DEBUGS() << "updating thumbnail" << LL_ENDL;
getPreviewView(view)->updateSnapshot(FALSE, TRUE);
getPreviewView(view)->updateSnapshot(TRUE);
if(do_update)
{
LL_DEBUGS() << "Will update controls" << LL_ENDL;
updateControls(view);
setNeedRefresh(view, true);
}
}
}
@ -887,7 +879,6 @@ void LLFloaterSnapshot::Impl::onImageFormatChange(LLFloaterSnapshot* view)
LL_DEBUGS() << "image format changed, updating snapshot" << LL_ENDL;
getPreviewView(view)->updateSnapshot(TRUE);
updateControls(view);
setNeedRefresh(view, false); // we're refreshing
}
}
@ -956,6 +947,8 @@ void LLFloaterSnapshot::Impl::setImageSizeSpinnersValues(LLFloaterSnapshot *view
// static
void LLFloaterSnapshot::Impl::updateSpinners(LLFloaterSnapshot* view, LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL is_width_changed)
{
getWidthSpinner(view)->resetDirty();
getHeightSpinner(view)->resetDirty();
if (checkImageSize(previewp, width, height, is_width_changed, previewp->getMaxImageSize()))
{
setImageSizeSpinnersValues(view, width, height);
@ -965,8 +958,6 @@ void LLFloaterSnapshot::Impl::updateSpinners(LLFloaterSnapshot* view, LLSnapshot
// static
void LLFloaterSnapshot::Impl::applyCustomResolution(LLFloaterSnapshot* view, S32 w, S32 h)
{
bool need_refresh = false;
LL_DEBUGS() << "applyCustomResolution(" << w << ", " << h << ")" << LL_ENDL;
if (!view) return;
@ -981,25 +972,16 @@ void LLFloaterSnapshot::Impl::applyCustomResolution(LLFloaterSnapshot* view, S32
//if to upload a snapshot, process spinner input in a special way.
previewp->setMaxImageSize((S32) getWidthSpinner(view)->getMaxValue()) ;
updateSpinners(view, previewp, w, h, w != curw); // may change w and h
previewp->setSize(w,h);
checkAutoSnapshot(previewp, FALSE);
LL_DEBUGS() << "applied custom resolution, updating thumbnail" << LL_ENDL;
previewp->updateSnapshot(FALSE, TRUE);
comboSetCustom(view, "profile_size_combo");
comboSetCustom(view, "postcard_size_combo");
comboSetCustom(view, "texture_size_combo");
comboSetCustom(view, "local_size_combo");
need_refresh = true;
LL_DEBUGS() << "applied custom resolution, updating thumbnail" << LL_ENDL;
previewp->updateSnapshot(TRUE);
}
}
updateControls(view);
if (need_refresh)
{
setNeedRefresh(view, true); // need to do this after updateControls()
}
}
// static
@ -1055,8 +1037,6 @@ BOOL LLFloaterSnapshot::postBuild()
mSucceessLblPanel = getChild<LLUICtrl>("succeeded_panel");
mFailureLblPanel = getChild<LLUICtrl>("failed_panel");
childSetAction("advanced_options_btn", Impl::onClickMore, this);
childSetCommitCallback("ui_check", Impl::onClickUICheck, this);
getChild<LLUICtrl>("ui_check")->setValue(gSavedSettings.getBOOL("RenderUIInSnapshot"));
@ -1075,24 +1055,15 @@ BOOL LLFloaterSnapshot::postBuild()
getChild<LLUICtrl>("auto_snapshot_check")->setValue(gSavedSettings.getBOOL("AutoSnapshot"));
childSetCommitCallback("auto_snapshot_check", Impl::onClickAutoSnap, this);
// Filters
LLComboBox* filterbox = getChild<LLComboBox>("filters_combobox");
if (gSavedSettings.getBOOL("SnapshotFiltersEnabled"))
std::vector<std::string> filter_list = LLImageFiltersManager::getInstance()->getFiltersList();
for (U32 i = 0; i < filter_list.size(); i++)
{
// Update filter list if setting is on (experimental)
std::vector<std::string> filter_list = LLImageFiltersManager::getInstance()->getFiltersList();
for (U32 i = 0; i < filter_list.size(); i++)
{
filterbox->add(filter_list[i]);
}
childSetCommitCallback("filters_combobox", Impl::onClickFilter, this);
}
else
{
// Hide Filter UI if setting is off (default)
getChild<LLUICtrl>("filter_list_label")->setVisible(FALSE);
filterbox->setVisible(FALSE);
filterbox->add(filter_list[i]);
}
childSetCommitCallback("filters_combobox", Impl::onClickFilter, this);
LLWebProfile::setImageUploadResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSnapshotUploadFinished, _1));
LLPostCard::setPostResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSendingPostcardFinished, _1));
@ -1119,7 +1090,7 @@ BOOL LLFloaterSnapshot::postBuild()
getChild<LLComboBox>("profile_size_combo")->selectNthItem(0);
getChild<LLComboBox>("postcard_size_combo")->selectNthItem(0);
getChild<LLComboBox>("texture_size_combo")->selectNthItem(0);
getChild<LLComboBox>("local_size_combo")->selectNthItem(0);
getChild<LLComboBox>("local_size_combo")->selectNthItem(8);
getChild<LLComboBox>("local_format_combo")->selectNthItem(0);
impl.mPreviewHandle = previewp->getHandle();
@ -1145,7 +1116,7 @@ void LLFloaterSnapshot::draw()
LLFloater::draw();
if (previewp && !isMinimized())
if (previewp && !isMinimized() && sThumbnailPlaceholder->getVisible())
{
if(previewp->getThumbnailImage())
{
@ -1172,44 +1143,13 @@ void LLFloaterSnapshot::draw()
previewp->drawPreviewRect(offset_x, offset_y) ;
// Draw some controls on top of the preview thumbnail.
static const S32 PADDING = 5;
static const S32 REFRESH_LBL_BG_HEIGHT = 32;
// Reshape and position the posting result message panels at the top of the thumbnail.
// Do this regardless of current posting status (finished or not) to avoid flicker
// when the result message is displayed for the first time.
// if (impl.getStatus() == Impl::STATUS_FINISHED)
{
LLRect result_lbl_rect = mSucceessLblPanel->getRect();
const S32 result_lbl_h = result_lbl_rect.getHeight();
result_lbl_rect.setLeftTopAndSize(local_offset_x, local_offset_y + thumbnail_h, thumbnail_w - 1, result_lbl_h);
mSucceessLblPanel->reshape(result_lbl_rect.getWidth(), result_lbl_h);
mSucceessLblPanel->setRect(result_lbl_rect);
mFailureLblPanel->reshape(result_lbl_rect.getWidth(), result_lbl_h);
mFailureLblPanel->setRect(result_lbl_rect);
}
// Position the refresh button in the bottom left corner of the thumbnail.
mRefreshBtn->setOrigin(local_offset_x + PADDING, local_offset_y + PADDING);
if (impl.mNeedRefresh)
{
// Place the refresh hint text to the right of the refresh button.
const LLRect& refresh_btn_rect = mRefreshBtn->getRect();
mRefreshLabel->setOrigin(refresh_btn_rect.mLeft + refresh_btn_rect.getWidth() + PADDING, refresh_btn_rect.mBottom);
// Draw the refresh hint background.
LLRect refresh_label_bg_rect(offset_x, offset_y + REFRESH_LBL_BG_HEIGHT, offset_x + thumbnail_w - 1, offset_y);
gl_rect_2d(refresh_label_bg_rect, LLColor4::white % 0.9f, TRUE);
}
gGL.pushUIMatrix();
LLUI::translate((F32) thumbnail_rect.mLeft, (F32) thumbnail_rect.mBottom);
sThumbnailPlaceholder->draw();
gGL.popUIMatrix();
}
}
impl.updateLayout(this);
}
void LLFloaterSnapshot::onOpen(const LLSD& key)
@ -1225,6 +1165,9 @@ void LLFloaterSnapshot::onOpen(const LLSD& key)
gSnapshotFloaterView->setVisible(TRUE);
gSnapshotFloaterView->adjustToFitScreen(this, FALSE);
impl.updateControls(this);
impl.updateLayout(this);
// Initialize default tab.
getChild<LLSideTrayPanelContainer>("panel_container")->getCurrentPanel()->onOpen(LLSD());
}
@ -1293,8 +1236,6 @@ S32 LLFloaterSnapshot::notify(const LLSD& info)
{
// Disable the send/post/save buttons until snapshot is ready.
impl.updateControls(this);
// Force hiding the "Refresh to save" hint because we know we've just started refresh.
impl.setNeedRefresh(this, false);
return 1;
}

View File

@ -50,6 +50,7 @@
#include "llviewerregion.h"
#include "lluictrlfactory.h"
#include "llviewerwindow.h"
#include "llfloaterregioninfo.h"
//LLFloaterTopObjects* LLFloaterTopObjects::sInstance = NULL;
@ -207,7 +208,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
columns[column_num++]["font"] = "SANSSERIF";
columns[column_num]["column"] = "location";
columns[column_num]["value"] = llformat("<%0.1f,%0.1f,%0.1f>", location_x, location_y, location_z);
columns[column_num]["value"] = llformat("<%0.f, %0.f, %0.f>", location_x, location_y, location_z);
columns[column_num++]["font"] = "SANSSERIF";
columns[column_num]["column"] = "parcel";
@ -257,6 +258,8 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
format.setArg("[COUNT]", llformat("%d", total_count));
format.setArg("[TIME]", llformat("%0.3f", mtotalScore));
getChild<LLUICtrl>("title_text")->setValue(LLSD(format));
list->setColumnLabel("URLs", getString("URLs"));
list->setColumnLabel("memory", getString("memory"));
}
else
{
@ -268,6 +271,13 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
format.setArg("[COUNT]", llformat("%d", total_count));
getChild<LLUICtrl>("title_text")->setValue(LLSD(format));
}
LLFloaterRegionInfo* region_info_floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
if(region_info_floater)
{
region_info_floater->enableTopButtons();
}
getChildView("refresh_btn")->setEnabled(true);
}
void LLFloaterTopObjects::onCommitObjectsList()
@ -453,12 +463,24 @@ void LLFloaterTopObjects::onRefresh()
msg->addStringFast(_PREHASH_Filter, filter);
msg->addS32Fast(_PREHASH_ParcelLocalID, 0);
LLFloaterRegionInfo* region_info_floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
if(region_info_floater)
{
region_info_floater->disableTopButtons();
}
disableRefreshBtn();
msg->sendReliable(gAgent.getRegionHost());
mFilter.clear();
mFlags = 0;
}
void LLFloaterTopObjects::disableRefreshBtn()
{
getChildView("refresh_btn")->setEnabled(false);
}
void LLFloaterTopObjects::onGetByObjectName()
{
mFlags = STAT_FILTER_BY_OBJECT;

View File

@ -66,6 +66,7 @@ public:
void onRefresh();
static void setMode(U32 mode);
void disableRefreshBtn();
private:
LLFloaterTopObjects(const LLSD& key);

View File

@ -64,7 +64,6 @@ const std::string DEFAULT_STATUS_TEXT = " #SecondLife";
///////////////////////////
LLTwitterPhotoPanel::LLTwitterPhotoPanel() :
mSnapshotPanel(NULL),
mResolutionComboBox(NULL),
mRefreshBtn(NULL),
mBtnPreview(NULL),
@ -94,7 +93,6 @@ BOOL LLTwitterPhotoPanel::postBuild()
{
setVisibleCallback(boost::bind(&LLTwitterPhotoPanel::onVisibilityChange, this, _2));
mSnapshotPanel = getChild<LLUICtrl>("snapshot_panel");
mResolutionComboBox = getChild<LLUICtrl>("resolution_combobox");
mResolutionComboBox->setValue("[i800,i600]"); // hardcoded defaults ftw!
mResolutionComboBox->setCommitCallback(boost::bind(&LLTwitterPhotoPanel::updateResolution, this, TRUE));
@ -194,15 +192,8 @@ void LLTwitterPhotoPanel::draw()
// calc preview offset within the preview rect
const S32 local_offset_x = (thumbnail_rect.getWidth() - thumbnail_w) / 2 ;
const S32 local_offset_y = (thumbnail_rect.getHeight() - thumbnail_h) / 2 ;
// calc preview offset within the floater rect
// Hack : To get the full offset, we need to take into account each and every offset of each widgets up to the floater.
// This is almost as arbitrary as using a fixed offset so that's what we do here for the sake of simplicity.
// *TODO : Get the offset looking through the hierarchy of widgets, should be done in postBuild() so to avoid traversing the hierarchy each time.
S32 offset_x = thumbnail_rect.mLeft + local_offset_x - 1;
S32 offset_y = thumbnail_rect.mBottom + local_offset_y - 39;
mSnapshotPanel->localPointToOtherView(offset_x, offset_y, &offset_x, &offset_y, getParentByType<LLFloater>());
S32 offset_x = thumbnail_rect.mLeft + local_offset_x;
S32 offset_y = thumbnail_rect.mBottom + local_offset_y;
gGL.matrixMode(LLRender::MM_MODELVIEW);
// Apply floater transparency to the texture unless the floater is focused.
@ -238,7 +229,7 @@ void LLTwitterPhotoPanel::onVisibilityChange(BOOL visible)
LLSnapshotLivePreview* preview = getPreviewView();
if(preview)
{
lldebugs << "opened, updating snapshot" << llendl;
LL_DEBUGS() << "opened, updating snapshot" << LL_ENDL;
preview->updateSnapshot(TRUE);
}
}
@ -455,7 +446,7 @@ void LLTwitterPhotoPanel::updateControls()
BOOL got_snap = previewp && previewp->getSnapshotUpToDate();
// *TODO: Separate maximum size for Web images from postcards
lldebugs << "Is snapshot up-to-date? " << got_snap << llendl;
LL_DEBUGS() << "Is snapshot up-to-date? " << got_snap << LL_ENDL;
updateResolution(FALSE);
}
@ -485,13 +476,13 @@ void LLTwitterPhotoPanel::updateResolution(BOOL do_update)
if (width == 0 || height == 0)
{
// take resolution from current window size
lldebugs << "Setting preview res from window: " << gViewerWindow->getWindowWidthRaw() << "x" << gViewerWindow->getWindowHeightRaw() << llendl;
LL_DEBUGS() << "Setting preview res from window: " << gViewerWindow->getWindowWidthRaw() << "x" << gViewerWindow->getWindowHeightRaw() << LL_ENDL;
previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
}
else
{
// use the resolution from the selected pre-canned drop-down choice
lldebugs << "Setting preview res selected from combo: " << width << "x" << height << llendl;
LL_DEBUGS() << "Setting preview res selected from combo: " << width << "x" << height << LL_ENDL;
previewp->setSize(width, height);
}
@ -755,7 +746,7 @@ void LLFloaterTwitter::showPhotoPanel()
LLTabContainer* parent = dynamic_cast<LLTabContainer*>(mTwitterPhotoPanel->getParent());
if (!parent)
{
llwarns << "Cannot find panel container" << llendl;
LL_WARNS() << "Cannot find panel container" << LL_ENDL;
return;
}

View File

@ -70,7 +70,6 @@ private:
LLHandle<LLView> mPreviewHandle;
LLUICtrl * mSnapshotPanel;
LLUICtrl * mResolutionComboBox;
LLUICtrl * mFilterComboBox;
LLUICtrl * mRefreshBtn;

View File

@ -39,6 +39,7 @@
#include "llfolderview.h"
#include "llinventorybridge.h"
#include "llviewerfoldertype.h"
#include "llradiogroup.h"
// linden library includes
#include "llclipboard.h"
@ -53,6 +54,7 @@ LLInventoryFilter::FilterOps::FilterOps(const Params& p)
mMinDate(p.date_range.min_date),
mMaxDate(p.date_range.max_date),
mHoursAgo(p.hours_ago),
mDateSearchDirection(p.date_search_direction),
mShowFolderState(p.show_folder_state),
mPermissions(p.permissions),
mFilterTypes(p.types),
@ -240,6 +242,7 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent
{
const U16 HOURS_TO_SECONDS = 3600;
time_t earliest = time_corrected() - mFilterOps.mHoursAgo * HOURS_TO_SECONDS;
if (mFilterOps.mMinDate > time_min() && mFilterOps.mMinDate < earliest)
{
earliest = mFilterOps.mMinDate;
@ -248,9 +251,19 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent
{
earliest = 0;
}
if (listener->getCreationDate() < earliest ||
listener->getCreationDate() > mFilterOps.mMaxDate)
return FALSE;
if (FILTERDATEDIRECTION_NEWER == mFilterOps.mDateSearchDirection || isSinceLogoff())
{
if (listener->getCreationDate() < earliest ||
listener->getCreationDate() > mFilterOps.mMaxDate)
return FALSE;
}
else
{
if (listener->getCreationDate() > earliest ||
listener->getCreationDate() > mFilterOps.mMaxDate)
return FALSE;
}
}
////////////////////////////////////////////////////////////////////////////////
@ -675,11 +688,22 @@ void LLInventoryFilter::setHoursAgo(U32 hours)
bool are_date_limits_valid = mFilterOps.mMinDate == time_min() && mFilterOps.mMaxDate == time_max();
bool is_increasing = hours > mFilterOps.mHoursAgo;
bool is_decreasing = hours < mFilterOps.mHoursAgo;
bool is_increasing_from_zero = is_increasing && !mFilterOps.mHoursAgo && !isSinceLogoff();
// *NOTE: need to cache last filter time, in case filter goes stale
BOOL less_restrictive = (are_date_limits_valid && ((is_increasing && mFilterOps.mHoursAgo)) || !hours);
BOOL more_restrictive = (are_date_limits_valid && (!is_increasing && hours) || is_increasing_from_zero);
BOOL less_restrictive;
BOOL more_restrictive;
if (FILTERDATEDIRECTION_NEWER == mFilterOps.mDateSearchDirection)
{
less_restrictive = (are_date_limits_valid && ((is_increasing && mFilterOps.mHoursAgo)) || !hours);
more_restrictive = (are_date_limits_valid && (!is_increasing && hours) || is_increasing_from_zero);
}
else
{
less_restrictive = (are_date_limits_valid && ((is_decreasing && mFilterOps.mHoursAgo)) || !hours);
more_restrictive = (are_date_limits_valid && (!is_decreasing && hours) || is_increasing_from_zero);
}
mFilterOps.mHoursAgo = hours;
mFilterOps.mMinDate = time_min();
@ -708,6 +732,20 @@ void LLInventoryFilter::setHoursAgo(U32 hours)
}
}
void LLInventoryFilter::setDateSearchDirection(U32 direction)
{
if (direction != mFilterOps.mDateSearchDirection)
{
mFilterOps.mDateSearchDirection = direction;
setModified(FILTER_RESTART);
}
}
U32 LLInventoryFilter::getDateSearchDirection() const
{
return mFilterOps.mDateSearchDirection;
}
void LLInventoryFilter::setFilterLinks(U64 filter_links)
{
if (mFilterOps.mFilterLinks != filter_links)
@ -972,6 +1010,7 @@ LLInventoryFilter& LLInventoryFilter::operator=( const LLInventoryFilter& othe
setFilterObjectTypes(other.getFilterObjectTypes());
setDateRange(other.getMinDate(), other.getMaxDate());
setHoursAgo(other.getHoursAgo());
setDateSearchDirection(other.getDateSearchDirection());
setShowFolderState(other.getShowFolderState());
setFilterPermissions(other.getFilterPermissions());
setFilterSubString(other.getFilterSubString());
@ -991,6 +1030,7 @@ void LLInventoryFilter::toParams(Params& params) const
params.filter_ops.date_range.min_date = getMinDate();
params.filter_ops.date_range.max_date = getMaxDate();
params.filter_ops.hours_ago = getHoursAgo();
params.filter_ops.date_search_direction = getDateSearchDirection();
params.filter_ops.show_folder_state = getShowFolderState();
params.filter_ops.permissions = getFilterPermissions();
params.substring = getFilterSubString();
@ -1012,6 +1052,7 @@ void LLInventoryFilter::fromParams(const Params& params)
}
setDateRange(params.filter_ops.date_range.min_date, params.filter_ops.date_range.max_date);
setHoursAgo(params.filter_ops.hours_ago);
setDateSearchDirection(params.filter_ops.date_search_direction);
setShowFolderState(params.filter_ops.show_folder_state);
setFilterPermissions(params.filter_ops.permissions);
setFilterSubString(params.substring);

View File

@ -58,6 +58,12 @@ public:
FILTERTYPE_MARKETPLACE_UNASSOCIATED = 0x1 << 8 // pass if folder is a marketplace non associated (no market ID) folder
};
enum EFilterDateDirection
{
FILTERDATEDIRECTION_NEWER,
FILTERDATEDIRECTION_OLDER
};
enum EFilterLink
{
FILTERLINK_INCLUDE_LINKS, // show links too
@ -98,7 +104,8 @@ public:
Optional<EFilterLink> links;
Optional<LLUUID> uuid;
Optional<DateRange> date_range;
Optional<S32> hours_ago;
Optional<U32> hours_ago;
Optional<U32> date_search_direction;
Optional<EFolderShow> show_folder_state;
Optional<PermissionMask> permissions;
@ -111,6 +118,7 @@ public:
uuid("uuid"),
date_range("date_range"),
hours_ago("hours_ago", 0),
date_search_direction("date_search_direction", FILTERDATEDIRECTION_NEWER),
show_folder_state("show_folder_state", SHOW_NON_EMPTY_FOLDERS),
permissions("permissions", PERM_NONE)
{}
@ -128,6 +136,7 @@ public:
time_t mMinDate,
mMaxDate;
U32 mHoursAgo;
U32 mDateSearchDirection;
EFolderShow mShowFolderState;
PermissionMask mPermissions;
@ -184,6 +193,8 @@ public:
void setHoursAgo(U32 hours);
U32 getHoursAgo() const;
void setDateSearchDirection(U32 direction);
U32 getDateSearchDirection() const;
void setFilterLinks(U64 filter_link);
U64 getFilterLinks() const;

View File

@ -406,6 +406,11 @@ void LLInventoryPanel::setHoursAgo(U32 hours)
getFilter().setHoursAgo(hours);
}
void LLInventoryPanel::setDateSearchDirection(U32 direction)
{
getFilter().setDateSearchDirection(direction);
}
void LLInventoryPanel::setFilterLinks(U64 filter_links)
{
getFilter().setFilterLinks(filter_links);

View File

@ -177,6 +177,7 @@ public:
const std::string getFilterSubString();
void setSinceLogoff(BOOL sl);
void setHoursAgo(U32 hours);
void setDateSearchDirection(U32 direction);
BOOL getSinceLogoff();
void setFilterLinks(U64 filter_links);

View File

@ -55,6 +55,7 @@
#include "llviewertexturelist.h"
#include "llsidepanelinventory.h"
#include "llfolderview.h"
#include "llradiogroup.h"
const std::string FILTERS_FILENAME("filters.xml");
@ -82,6 +83,7 @@ public:
void updateElementsFromFilter();
BOOL getCheckShowEmpty();
BOOL getCheckSinceLogoff();
U32 getDateSearchDirection();
static void onTimeAgo(LLUICtrl*, void *);
static void onCloseBtn(void* user_data);
@ -700,6 +702,30 @@ void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data)
if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() )
{
self->getChild<LLUICtrl>("check_since_logoff")->setValue(false);
U32 days = (U32)self->mSpinSinceDays->get();
U32 hours = (U32)self->mSpinSinceHours->get();
if (hours >= 24)
{
// Try to handle both cases of spinner clicking and text input in a sensible fashion as best as possible.
// There is no way to tell if someone has clicked the spinner to get to 24 or input 24 manually, so in
// this case add to days. Any value > 24 means they have input the hours manually, so do not add to the
// current day value.
if (24 == hours) // Got to 24 via spinner clicking or text input of 24
{
days = days + hours / 24;
}
else // Text input, so do not add to days
{
days = hours / 24;
}
hours = (U32)hours % 24;
self->mSpinSinceHours->setFocus(false);
self->mSpinSinceDays->setFocus(false);
self->mSpinSinceDays->set((F32)days);
self->mSpinSinceHours->set((F32)hours);
self->mSpinSinceHours->setFocus(true);
}
}
}
@ -719,6 +745,7 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()
std::string filter_string = mFilter->getFilterSubString();
LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState();
U32 hours = mFilter->getHoursAgo();
U32 date_search_direction = mFilter->getDateSearchDirection();
// update the ui elements
setTitle(mFilter->getName());
@ -740,6 +767,7 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()
getChild<LLUICtrl>("check_since_logoff")->setValue(mFilter->isSinceLogoff());
mSpinSinceHours->set((F32)(hours % 24));
mSpinSinceDays->set((F32)(hours / 24));
getChild<LLRadioGroup>("date_search_direction")->setSelectedIndex(date_search_direction);
}
void LLFloaterInventoryFinder::draw()
@ -840,17 +868,23 @@ void LLFloaterInventoryFinder::draw()
}
U32 days = (U32)mSpinSinceDays->get();
U32 hours = (U32)mSpinSinceHours->get();
if (hours > 24)
if (hours >= 24)
{
days += hours / 24;
days = hours / 24;
hours = (U32)hours % 24;
// A UI element that has focus will not display a new value set to it
mSpinSinceHours->setFocus(false);
mSpinSinceDays->setFocus(false);
mSpinSinceDays->set((F32)days);
mSpinSinceHours->set((F32)hours);
mSpinSinceHours->setFocus(true);
}
hours += days * 24;
mPanelMainInventory->getPanel()->setHoursAgo(hours);
mPanelMainInventory->getPanel()->setSinceLogoff(getCheckSinceLogoff());
mPanelMainInventory->setFilterTextFromFilter();
mPanelMainInventory->getPanel()->setDateSearchDirection(getDateSearchDirection());
LLPanel::draw();
}
@ -865,6 +899,11 @@ BOOL LLFloaterInventoryFinder::getCheckSinceLogoff()
return getChild<LLUICtrl>("check_since_logoff")->getValue();
}
U32 LLFloaterInventoryFinder::getDateSearchDirection()
{
return getChild<LLRadioGroup>("date_search_direction")->getSelectedIndex();
}
void LLFloaterInventoryFinder::onCloseBtn(void* user_data)
{
LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data;

View File

@ -65,8 +65,6 @@ void LLPanelSnapshot::onOpen(const LLSD& key)
{
LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true));
}
updateCustomResControls();
}
LLFloaterSnapshot::ESnapshotFormat LLPanelSnapshot::getImageFormat() const
@ -77,11 +75,6 @@ LLFloaterSnapshot::ESnapshotFormat LLPanelSnapshot::getImageFormat() const
void LLPanelSnapshot::enableControls(BOOL enable)
{
setCtrlsEnabled(enable);
if (enable)
{
// Make sure only relevant controls are enabled/shown.
updateCustomResControls();
}
}
LLSpinCtrl* LLPanelSnapshot::getWidthSpinner()
@ -121,16 +114,6 @@ LLSideTrayPanelContainer* LLPanelSnapshot::getParentContainer()
return parent;
}
// virtual
void LLPanelSnapshot::updateCustomResControls()
{
// Only show width/height spinners and the aspect ratio checkbox
// when a custom resolution is chosen.
LLComboBox* combo = getChild<LLComboBox>(getImageSizeComboName());
const bool show = combo->getFirstSelectedIndex() == (combo->getItemCount() - 1);
getChild<LLUICtrl>(getImageSizePanelName())->setVisible(show);
}
void LLPanelSnapshot::updateImageQualityLevel()
{
LLSliderCtrl* quality_slider = getChild<LLSliderCtrl>("image_quality_slider");
@ -188,8 +171,6 @@ void LLPanelSnapshot::onCustomResolutionCommit()
void LLPanelSnapshot::onResolutionComboCommit(LLUICtrl* ctrl)
{
updateCustomResControls();
LLSD info;
info["combo-res-change"]["control-name"] = ctrl->getName();
LLFloaterSnapshot::getInstance()->notify(info);

View File

@ -57,7 +57,6 @@ public:
protected:
LLSideTrayPanelContainer* getParentContainer();
virtual void updateCustomResControls();
void updateImageQualityLevel();
void goBack(); ///< Switch to the default (Snapshot Options) panel
void cancel();

View File

@ -49,7 +49,6 @@ public:
/*virtual*/ void onOpen(const LLSD& key);
private:
/*virtual*/ void updateCustomResControls(); ///< Show/hide custom resolution controls (spinners and checkbox)
/*virtual*/ std::string getWidthSpinnerName() const { return "inventory_snapshot_width"; }
/*virtual*/ std::string getHeightSpinnerName() const { return "inventory_snapshot_height"; }
/*virtual*/ std::string getAspectRatioCBName() const { return "inventory_keep_aspect_check"; }
@ -73,7 +72,6 @@ BOOL LLPanelSnapshotInventory::postBuild()
{
getChild<LLSpinCtrl>(getWidthSpinnerName())->setAllowEdit(FALSE);
getChild<LLSpinCtrl>(getHeightSpinnerName())->setAllowEdit(FALSE);
getChild<LLUICtrl>(getAspectRatioCBName())->setVisible(FALSE); // we don't keep aspect ratio for inventory textures
return LLPanelSnapshot::postBuild();
}
@ -84,17 +82,6 @@ void LLPanelSnapshotInventory::onOpen(const LLSD& key)
LLPanelSnapshot::onOpen(key);
}
// virtual
void LLPanelSnapshotInventory::updateCustomResControls()
{
LLComboBox* combo = getChild<LLComboBox>(getImageSizeComboName());
S32 selected_idx = combo->getFirstSelectedIndex();
const bool show = selected_idx == (combo->getItemCount() - 1); // Custom selected
getChild<LLUICtrl>(getWidthSpinnerName())->setVisible(show);
getChild<LLUICtrl>(getHeightSpinnerName())->setVisible(show);
}
// virtual
void LLPanelSnapshotInventory::updateControls(const LLSD& info)
{

View File

@ -72,7 +72,9 @@ LLPanelSnapshotOptions::LLPanelSnapshotOptions()
mCommitCallbackRegistrar.add("Snapshot.SaveToEmail", boost::bind(&LLPanelSnapshotOptions::onSaveToEmail, this));
mCommitCallbackRegistrar.add("Snapshot.SaveToInventory", boost::bind(&LLPanelSnapshotOptions::onSaveToInventory, this));
mCommitCallbackRegistrar.add("Snapshot.SaveToComputer", boost::bind(&LLPanelSnapshotOptions::onSaveToComputer, this));
mCommitCallbackRegistrar.add("Snapshot.SendToFacebook", boost::bind(&LLPanelSnapshotOptions::onSendToFacebook, this));
mCommitCallbackRegistrar.add("Snapshot.SendToTwitter", boost::bind(&LLPanelSnapshotOptions::onSendToTwitter, this));
mCommitCallbackRegistrar.add("Snapshot.SendToFlickr", boost::bind(&LLPanelSnapshotOptions::onSendToFlickr, this));
LLGlobalEconomy::Singleton::getInstance()->addObserver(this);
}
@ -84,13 +86,6 @@ LLPanelSnapshotOptions::~LLPanelSnapshotOptions()
// virtual
BOOL LLPanelSnapshotOptions::postBuild()
{
LLTextBox* sendToFacebookTextBox = getChild<LLTextBox>("send_to_facebook_textbox");
sendToFacebookTextBox->setURLClickedCallback(boost::bind(&LLPanelSnapshotOptions::onSendToFacebook, this));
LLTextBox* sendToTwitterTextBox = getChild<LLTextBox>("send_to_twitter_textbox");
sendToTwitterTextBox->setURLClickedCallback(boost::bind(&LLPanelSnapshotOptions::onSendToTwitter, this));
LLTextBox* sendToFlickrTextBox = getChild<LLTextBox>("send_to_flickr_textbox");
sendToFlickrTextBox->setURLClickedCallback(boost::bind(&LLPanelSnapshotOptions::onSendToFlickr, this));
return LLPanel::postBuild();
}

View File

@ -72,7 +72,6 @@ private:
void onMsgFormFocusRecieved();
void onFormatComboCommit(LLUICtrl* ctrl);
void onQualitySliderCommit(LLUICtrl* ctrl);
void onTabButtonPress(S32 btn_idx);
void onSend();
bool mHasFirstMsgFocus;
@ -86,8 +85,6 @@ LLPanelSnapshotPostcard::LLPanelSnapshotPostcard()
{
mCommitCallbackRegistrar.add("Postcard.Send", boost::bind(&LLPanelSnapshotPostcard::onSend, this));
mCommitCallbackRegistrar.add("Postcard.Cancel", boost::bind(&LLPanelSnapshotPostcard::cancel, this));
mCommitCallbackRegistrar.add("Postcard.Message", boost::bind(&LLPanelSnapshotPostcard::onTabButtonPress, this, 0));
mCommitCallbackRegistrar.add("Postcard.Settings", boost::bind(&LLPanelSnapshotPostcard::onTabButtonPress, this, 1));
}
@ -108,8 +105,6 @@ BOOL LLPanelSnapshotPostcard::postBuild()
getChild<LLUICtrl>("image_quality_slider")->setCommitCallback(boost::bind(&LLPanelSnapshotPostcard::onQualitySliderCommit, this, _1));
getChild<LLButton>("message_btn")->setToggleState(TRUE);
return LLPanelSnapshot::postBuild();
}
@ -218,27 +213,6 @@ void LLPanelSnapshotPostcard::onQualitySliderCommit(LLUICtrl* ctrl)
LLFloaterSnapshot::getInstance()->notify(info); // updates the "SnapshotQuality" setting
}
void LLPanelSnapshotPostcard::onTabButtonPress(S32 btn_idx)
{
LLButton* buttons[2] = {
getChild<LLButton>("message_btn"),
getChild<LLButton>("settings_btn"),
};
// Switch between Message and Settings tabs.
LLButton* clicked_btn = buttons[btn_idx];
LLButton* other_btn = buttons[!btn_idx];
LLSideTrayPanelContainer* container =
getChild<LLSideTrayPanelContainer>("postcard_panel_container");
container->selectTab(clicked_btn->getToggleState() ? btn_idx : !btn_idx);
//clicked_btn->setEnabled(FALSE);
other_btn->toggleState();
//other_btn->setEnabled(TRUE);
LL_DEBUGS() << "Button #" << btn_idx << " (" << clicked_btn->getName() << ") clicked" << LL_ENDL;
}
void LLPanelSnapshotPostcard::onSend()
{
// Validate input.

View File

@ -151,7 +151,7 @@ F32 LLSnapshotLivePreview::getImageAspect()
void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail, F32 delay)
{
lldebugs << "updateSnapshot: mSnapshotUpToDate = " << getSnapshotUpToDate() << llendl;
LL_DEBUGS() << "updateSnapshot: mSnapshotUpToDate = " << getSnapshotUpToDate() << LL_ENDL;
// Update snapshot if requested.
if (new_snapshot)
@ -195,6 +195,8 @@ void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail
mSnapshotDelayTimer.start();
mSnapshotDelayTimer.setTimerExpirySec(delay);
mPosTakenGlobal = gAgentCamera.getCameraPositionGlobal();
// Tell the floater container that the snapshot is in the process of updating itself
if (mViewContainer)
{
@ -594,7 +596,7 @@ void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update)
}
else
{
llwarns << "Couldn't find a path to the following filter : " << getFilter() << llendl;
LL_WARNS() << "Couldn't find a path to the following filter : " << getFilter() << LL_ENDL;
}
}
// Scale to a power of 2 so it can be mapped to a texture
@ -642,7 +644,7 @@ LLViewerTexture* LLSnapshotLivePreview::getBigThumbnailImage()
}
else
{
llwarns << "Couldn't find a path to the following filter : " << getFilter() << llendl;
LL_WARNS() << "Couldn't find a path to the following filter : " << getFilter() << LL_ENDL;
}
}
// Scale to a power of 2 so it can be mapped to a texture
@ -695,7 +697,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
// time to produce a snapshot
if(!previewp->getSnapshotUpToDate())
{
lldebugs << "producing snapshot" << llendl;
LL_DEBUGS() << "producing snapshot" << LL_ENDL;
if (!previewp->mPreviewImage)
{
previewp->mPreviewImage = new LLImageRaw;
@ -760,7 +762,6 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
curr_preview_image->setFilteringOption(previewp->getSnapshotType() == SNAPSHOT_TEXTURE ? LLTexUnit::TFO_ANISOTROPIC : LLTexUnit::TFO_POINT);
curr_preview_image->setAddressMode(LLTexUnit::TAM_CLAMP);
previewp->mPosTakenGlobal = gAgentCamera.getCameraPositionGlobal();
previewp->mShineCountdown = 4; // wait a few frames to avoid animation glitch due to readback this frame
}
}
@ -775,7 +776,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
previewp->setVisible(gSavedSettings.getBOOL("UseFreezeFrame") && previewp->mAllowFullScreenPreview); // only show fullscreen preview when in freeze frame mode
previewp->mSnapshotDelayTimer.stop();
previewp->mSnapshotActive = FALSE;
lldebugs << "done creating snapshot" << llendl;
LL_DEBUGS() << "done creating snapshot" << LL_ENDL;
}
if (!previewp->getThumbnailUpToDate())
@ -910,13 +911,13 @@ LLPointer<LLImageFormatted> LLSnapshotLivePreview::getFormattedImage()
}
else
{
llwarns << "Couldn't find a path to the following filter : " << getFilter() << llendl;
LL_WARNS() << "Couldn't find a path to the following filter : " << getFilter() << LL_ENDL;
}
}
// Create the new formatted image of the appropriate format.
LLFloaterSnapshot::ESnapshotFormat format = getSnapshotFormat();
lldebugs << "Encoding new image of format " << format << llendl;
LL_DEBUGS() << "Encoding new image of format " << format << LL_ENDL;
switch (format)
{
@ -975,6 +976,21 @@ void LLSnapshotLivePreview::saveTexture()
mPreviewImage->getHeight(),
mPreviewImage->getComponents());
// Apply the filter to mPreviewImage
if (getFilter() != "")
{
std::string filter_path = LLImageFiltersManager::getInstance()->getFilterPath(getFilter());
if (filter_path != "")
{
LLImageFilter filter(filter_path);
filter.executeFilter(scaled);
}
else
{
LL_WARNS() << "Couldn't find a path to the following filter : " << getFilter() << LL_ENDL;
}
}
scaled->biasedScaleToPowerOfTwo(MAX_TEXTURE_SIZE);
LL_DEBUGS() << "scaled texture to " << scaled->getWidth() << "x" << scaled->getHeight() << LL_ENDL;

View File

@ -47,23 +47,22 @@ public:
LL_DEBUGS("SyntaxLSL") << "Instantiating with file saving to: '" << filespec << "'" << LL_ENDL;
}
virtual void errorWithContent(U32 status,
const std::string& reason,
const LLSD& content)
/* virtual */ void httpFailure()
{
LL_WARNS("SyntaxLSL") << "failed to fetch syntax file [status:" << status << "]: " << content << LL_ENDL;
LL_WARNS("SyntaxLSL") << "failed to fetch syntax file [status:" << getStatus() << "]: " << getContent() << LL_ENDL;
}
virtual void result(const LLSD& content_ref)
/* virtual */ void httpSuccess()
{
// Continue only if a valid LLSD object was returned.
if (content_ref.isMap())
const LLSD& content = getContent();
if (content.isMap())
{
if (LLSyntaxIdLSL::getInstance()->isSupportedVersion(content_ref))
if (LLSyntaxIdLSL::getInstance()->isSupportedVersion(content))
{
LLSyntaxIdLSL::getInstance()->setKeywordsXml(content_ref);
LLSyntaxIdLSL::getInstance()->setKeywordsXml(content);
cacheFile(content_ref);
cacheFile(content);
LLSyntaxIdLSL::getInstance()->handleFileFetched(mFileSpec);
}
else

View File

@ -1346,17 +1346,20 @@ bool LLTextureFetchWorker::doWork(S32 param)
LL_WARNS(LOG_TXT) << "trying to seek a non-default texture on the sim. Bad!" << LL_ENDL;
}
setUrl(http_url + "/?texture_id=" + mID.asString().c_str());
LL_DEBUGS("Texture") << "Texture URL " << mUrl << LL_ENDL;
mWriteToCacheState = CAN_WRITE ; //because this texture has a fixed texture id.
}
else
{
mCanUseHTTP = false ;
LL_DEBUGS("Texture") << "Texture not available via HTTP: no URL " << mUrl << LL_ENDL;
}
}
else
{
// This will happen if not logged in or if a region deoes not have HTTP Texture enabled
//LL_WARNS(LOG_TXT) << "Region not found for host: " << mHost << LL_ENDL;
LL_DEBUGS("Texture") << "Texture not available via HTTP: no region " << mUrl << LL_ENDL;
mCanUseHTTP = false;
}
}

View File

@ -5747,83 +5747,101 @@ bool handle_special_notification(std::string notificationID, LLSD& llsdBlock)
}
// some of the server notifications need special handling. This is where we do that.
bool handle_teleport_access_blocked(LLSD& llsdBlock)
bool handle_teleport_access_blocked(LLSD& llsdBlock, const std::string & notificationID, const std::string & defaultMessage)
{
std::string notificationID("TeleportEntryAccessBlocked");
U8 regionAccess = static_cast<U8>(llsdBlock["_region_access"].asInteger());
std::string regionMaturity = LLViewerRegion::accessToString(regionAccess);
LLStringUtil::toLower(regionMaturity);
llsdBlock["REGIONMATURITY"] = regionMaturity;
bool returnValue = false;
LLNotificationPtr maturityLevelNotification;
std::string notifySuffix = "_Notify";
if (regionAccess == SIM_ACCESS_MATURE)
{
if (gAgent.isTeen())
{
gAgent.clearTeleportRequest();
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
returnValue = true;
LLNotificationPtr tp_failure_notification;
std::string notifySuffix;
notifySuffix = "_NotifyAdultsOnly";
}
else if (gAgent.prefersPG())
if (notificationID == std::string("TeleportEntryAccessBlocked"))
{
notifySuffix = "_Notify";
if (regionAccess == SIM_ACCESS_MATURE)
{
if (gAgent.hasRestartableFailedTeleportRequest())
if (gAgent.isTeen())
{
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_ChangeAndReTeleport", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_and_reteleport_callback);
gAgent.clearTeleportRequest();
tp_failure_notification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
returnValue = true;
notifySuffix = "_NotifyAdultsOnly";
}
else if (gAgent.prefersPG())
{
if (gAgent.hasRestartableFailedTeleportRequest())
{
tp_failure_notification = LLNotificationsUtil::add(notificationID+"_ChangeAndReTeleport", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_and_reteleport_callback);
returnValue = true;
}
else
{
gAgent.clearTeleportRequest();
tp_failure_notification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
returnValue = true;
}
}
else
{
gAgent.clearTeleportRequest();
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
tp_failure_notification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
returnValue = true;
}
}
else if (regionAccess == SIM_ACCESS_ADULT)
{
if (!gAgent.isAdult())
{
gAgent.clearTeleportRequest();
tp_failure_notification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
returnValue = true;
notifySuffix = "_NotifyAdultsOnly";
}
else if (gAgent.prefersPG() || gAgent.prefersMature())
{
if (gAgent.hasRestartableFailedTeleportRequest())
{
tp_failure_notification = LLNotificationsUtil::add(notificationID+"_ChangeAndReTeleport", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_and_reteleport_callback);
returnValue = true;
}
else
{
gAgent.clearTeleportRequest();
tp_failure_notification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
returnValue = true;
}
}
else
{
gAgent.clearTeleportRequest();
tp_failure_notification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
returnValue = true;
}
}
} // End of special handling for "TeleportEntryAccessBlocked"
else
{ // Normal case, no message munging
gAgent.clearTeleportRequest();
if (LLNotifications::getInstance()->templateExists(notificationID))
{
tp_failure_notification = LLNotificationsUtil::add(notificationID, llsdBlock, llsdBlock);
}
else
{
gAgent.clearTeleportRequest();
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
returnValue = true;
llsdBlock["MESSAGE"] = defaultMessage;
tp_failure_notification = LLNotificationsUtil::add("GenericAlertOK", llsdBlock);
}
returnValue = true;
}
else if (regionAccess == SIM_ACCESS_ADULT)
{
if (!gAgent.isAdult())
{
gAgent.clearTeleportRequest();
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
returnValue = true;
notifySuffix = "_NotifyAdultsOnly";
}
else if (gAgent.prefersPG() || gAgent.prefersMature())
{
if (gAgent.hasRestartableFailedTeleportRequest())
{
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_ChangeAndReTeleport", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_and_reteleport_callback);
returnValue = true;
}
else
{
gAgent.clearTeleportRequest();
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
returnValue = true;
}
}
else
{
gAgent.clearTeleportRequest();
maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
returnValue = true;
}
}
if ((maturityLevelNotification == NULL) || maturityLevelNotification->isIgnored())
if ((tp_failure_notification == NULL) || tp_failure_notification->isIgnored())
{
// Given a simple notification if no maturityLevelNotification is set or it is ignore
// Given a simple notification if no tp_failure_notification is set or it is ignore
LLNotificationsUtil::add(notificationID + notifySuffix, llsdBlock);
}
@ -6039,8 +6057,8 @@ void process_alert_core(const std::string& message, BOOL modal)
std::string alert_name(message.substr(ALERT_PREFIX.length()));
if (!handle_special_alerts(alert_name))
{
LLNotificationsUtil::add(alert_name);
}
LLNotificationsUtil::add(alert_name);
}
}
else if (message.find(NOTIFY_PREFIX) == 0)
{
@ -6062,10 +6080,10 @@ void process_alert_core(const std::string& message, BOOL modal)
LLFloaterRegionRestarting::close();
}
std::string new_msg =LLNotifications::instance().getGlobalString(text);
args["MESSAGE"] = new_msg;
LLNotificationsUtil::add("SystemMessage", args);
}
std::string new_msg =LLNotifications::instance().getGlobalString(text);
args["MESSAGE"] = new_msg;
LLNotificationsUtil::add("SystemMessage", args);
}
else if (modal)
{
LLSD args;
@ -6648,8 +6666,8 @@ std::string formatted_time(const time_t& the_time)
void process_teleport_failed(LLMessageSystem *msg, void**)
{
std::string reason;
std::string big_reason;
std::string message_id; // Tag from server, like "RegionEntryAccessBlocked"
std::string big_reason; // Actual message to display
LLSD args;
// Let the interested parties know that teleport failed.
@ -6659,16 +6677,16 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
if (msg->has(_PREHASH_AlertInfo) && msg->getSizeFast(_PREHASH_AlertInfo, _PREHASH_Message) > 0)
{
// Get the message ID
msg->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, reason);
big_reason = LLAgent::sTeleportErrorMessages[reason];
msg->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, message_id);
big_reason = LLAgent::sTeleportErrorMessages[message_id];
if ( big_reason.size() > 0 )
{ // Substitute verbose reason from the local map
args["REASON"] = big_reason;
}
else
{ // Nothing found in the map - use what the server returned in the original message block
msg->getStringFast(_PREHASH_Info, _PREHASH_Reason, reason);
args["REASON"] = reason;
msg->getStringFast(_PREHASH_Info, _PREHASH_Reason, big_reason);
args["REASON"] = big_reason;
}
LLSD llsd_block;
@ -6684,7 +6702,7 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
else
{
// change notification name in this special case
if (handle_teleport_access_blocked(llsd_block))
if (handle_teleport_access_blocked(llsd_block, message_id, args["REASON"]))
{
if( gAgent.getTeleportState() != LLAgent::TELEPORT_NONE )
{
@ -6697,17 +6715,17 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
}
else
{
msg->getStringFast(_PREHASH_Info, _PREHASH_Reason, reason);
{ // Extra message payload not found - use what the simulator sent
msg->getStringFast(_PREHASH_Info, _PREHASH_Reason, message_id);
big_reason = LLAgent::sTeleportErrorMessages[reason];
big_reason = LLAgent::sTeleportErrorMessages[message_id];
if ( big_reason.size() > 0 )
{ // Substitute verbose reason from the local map
args["REASON"] = big_reason;
}
else
{ // Nothing found in the map - use what the server returned
args["REASON"] = reason;
args["REASON"] = message_id;
}
}

View File

@ -285,8 +285,8 @@ private:
{
regionp->setCapability(iter->first, iter->second);
LL_DEBUGS("AppInit", "Capabilities") << "got capability for "
<< iter->first << LL_ENDL;
LL_DEBUGS("AppInit", "Capabilities")
<< "Capability '" << iter->first << "' is '" << iter->second << "'" << LL_ENDL;
/* HACK we're waiting for the ServerReleaseNotes */
if (iter->first == "ServerReleaseNotes" && regionp->getReleaseNotesRequested())

View File

@ -41,23 +41,24 @@
</string>
<button name="advanced_options_btn" tool_tip="Erweiterte Optionen"/>
<text name="image_res_text">
[WIDTH] x [HEIGHT] px
[WIDTH]px (Breite) x [HEIGHT]px (Höhe)
</text>
<text name="file_size_label">
[SIZE] KB
</text>
<button name="advanced_options" label="AUFNAHME OPTIONEN"/>
<panel name="advanced_options_panel">
<text name="advanced_options_label">
ERWEITERTE OPTIONEN
</text>
<text name="layer_type_label">
Aufnahme:
Aufnehmen:
</text>
<combo_box label="Bildebenen" name="layer_types">
<combo_box.item label="Farben" name="Colors"/>
<combo_box.item label="Tiefe" name="Depth"/>
</combo_box>
<check_box label="Schnittstelle" name="ui_check"/>
<combo_box label="Filter" name="filters_combobox">
<combo_box.item label="Kein Filter" name="NoFilter"/>
</combo_box>
<check_box label="Benutzeroberfläche" name="ui_check"/>
<check_box label="HUDs" name="hud_check"/>
<check_box label="Standbild (Vollbild)" name="freeze_frame_check"/>
<check_box label="Automatisch aktualisieren" name="auto_snapshot_check"/>

View File

@ -9,13 +9,11 @@
<text name="subject_label">
Betreff:
</text>
<line_editor label="Betreff hier eingeben." name="subject_form"/>
<line_editor label="Betreff hier rein." name="subject_form"/>
<text name="msg_label">
Nachricht:
</text>
<text_editor name="msg_form">
Nachricht hier eingeben.
</text_editor>
<button label="Abbrechen" name="cancel_btn"/>
<button label="Senden" name="send_btn"/>
</panel>

View File

@ -7,17 +7,10 @@
<combo_box.item label="1024x768" name="1024x768"/>
<combo_box.item label="Benutzerdefiniert" name="Custom"/>
</combo_box>
<layout_stack name="postcard_image_params_ls">
<layout_panel name="postcard_image_size_lp">
<spinner label="Breite" name="postcard_snapshot_width"/>
<spinner label="Höhe" name="postcard_snapshot_height"/>
<check_box label="Seitenverhältnis beibehalten" name="postcard_keep_aspect_check"/>
</layout_panel>
<layout_panel name="postcard_image_format_quality_lp">
<slider label="Bildqualität" name="image_quality_slider"/>
<text name="image_quality_level">
([QLVL])
</text>
</layout_panel>
</layout_stack>
<spinner label="Breite x Höhe" name="postcard_snapshot_width"/>
<check_box label="Seitenverhältnis beibehalten" name="postcard_keep_aspect_check"/>
<slider label="Qualität" name="image_quality_slider"/>
<text name="image_quality_level">
([QLVL])
</text>
</panel>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_inventory">
<text name="title">
In meinem Inventar speichern
Inventar
</text>
<text name="hint_lbl">
Das Speichern eines Bilds in Ihrem Inventar kostet [UPLOAD_COST] L$. Um das Bild als Textur zu speichern, wählen Sie eines der quadratischen Formate aus.
@ -13,8 +13,7 @@
<combo_box.item label="Groß (512x512)" name="Large(512x512)"/>
<combo_box.item label="Benutzerdefiniert" name="Custom"/>
</combo_box>
<spinner label="Breite" name="inventory_snapshot_width"/>
<spinner label="Höhe" name="inventory_snapshot_height"/>
<spinner label="Breite x Höhe" name="inventory_snapshot_width"/>
<check_box label="Seitenverhältnis beibehalten" name="inventory_keep_aspect_check"/>
<button label="Abbrechen" name="cancel_btn"/>
<button label="Speichern" name="save_btn"/>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_local">
<text name="title">
Auf meinem Computer speichern
Festplatte
</text>
<combo_box label="Auflösung" name="local_size_combo">
<combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
@ -13,24 +13,17 @@
<combo_box.item label="1600x1200" name="1600x1200"/>
<combo_box.item label="Benutzerdefiniert" name="Custom"/>
</combo_box>
<layout_stack name="local_image_params_ls">
<layout_panel name="local_image_size_lp">
<spinner label="Breite" name="local_snapshot_width"/>
<spinner label="Höhe" name="local_snapshot_height"/>
<check_box label="Seitenverhältnis beibehalten" name="local_keep_aspect_check"/>
</layout_panel>
<layout_panel name="local_image_format_quality_lp">
<combo_box label="Format" name="local_format_combo">
<combo_box.item label="PNG (verlustfrei)" name="PNG"/>
<combo_box.item label="JPEG" name="JPEG"/>
<combo_box.item label="BMP (verlustfrei)" name="BMP"/>
</combo_box>
<slider label="Bildqualität" name="image_quality_slider"/>
<text name="image_quality_level">
([QLVL])
</text>
</layout_panel>
</layout_stack>
<spinner label="Breite x Höhe" name="local_snapshot_width"/>
<check_box label="Seitenverhältnis beibehalten" name="local_keep_aspect_check"/>
<combo_box label="Format" name="local_format_combo">
<combo_box.item label="PNG (verlustfrei)" name="PNG"/>
<combo_box.item label="JPEG" name="JPEG"/>
<combo_box.item label="BMP (verlustfrei)" name="BMP"/>
</combo_box>
<slider label="Qualität" name="image_quality_slider"/>
<text name="image_quality_level">
([QLVL])
</text>
<button label="Abbrechen" name="cancel_btn"/>
<flyout_button label="Speichern" name="save_btn" tool_tip="Bild als Datei speichern">
<flyout_button.item label="Speichern" name="save_item"/>

View File

@ -1,7 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
<button label="In meinem Profil posten" name="save_to_profile_btn"/>
<button label="E-Mail" name="save_to_email_btn"/>
<button label="In meinem Inventar speichern ([AMOUNT] L$)" name="save_to_inventory_btn"/>
<button label="Auf meinem Computer speichern" name="save_to_computer_btn"/>
<button label="Ins Profil hochladen" name="save_to_profile_btn"/>
<button label="Per E-Mail senden" name="save_to_email_btn"/>
<button label="Im Inventar speichern" name="save_to_inventory_btn"/>
<button label="Auf Festplatte speichern" name="save_to_computer_btn"/>
<button label="Zu Facebook hochladen" name="send_to_facebook_btn"/>
<button label="Zu Twitter hochladen" name="send_to_twitter_btn"/>
<button label="Zu Flickr hochladen" name="send_to_flickr_btn"/>
</panel>

View File

@ -12,6 +12,10 @@
<text name="title">
E-Mail
</text>
<button label="Nachricht" name="message_btn"/>
<button label="Einstellungen" name="settings_btn"/>
<tab_container name="postcard_tabs">
<panel name="panel_postcard_message" label="Nachricht"/>
<panel name="panel_postcard_settings" label="Einstellungen"/>
</tab_container>
<button name="cancel_btn" label="Abbrechen"/>
<button name="send_btn" label="Absenden"/>
</panel>

View File

@ -1,28 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_profile">
<text name="title">
In meinem Profil posten
Profil
</text>
<combo_box label="Auflösung" name="profile_size_combo">
<combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
<combo_box.item label="640x480" name="640x480"/>
<combo_box.item label="800x600" name="800x600"/>
<combo_box.item label="1024x768" name="1024x768"/>
<combo_box.item label="Benutzerdefiniert" name="Custom"/>
<combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
<combo_box.item label="640x480" name="640x480"/>
<combo_box.item label="800x600" name="800x600"/>
<combo_box.item label="1024x768" name="1024x768"/>
<combo_box.item label="Benutzerdefiniert" name="Custom"/>
</combo_box>
<layout_stack name="profile_image_params_ls">
<layout_panel name="profile_image_size_lp">
<spinner label="Breite" name="profile_snapshot_width"/>
<spinner label="Höhe" name="profile_snapshot_height"/>
<check_box label="Seitenverhältnis beibehalten" name="profile_keep_aspect_check"/>
</layout_panel>
<layout_panel name="profile_image_metadata_lp">
<text name="caption_label">
Bildunterschrift:
</text>
<check_box initial_value="true" label="Ort einschließen" name="add_location_cb"/>
</layout_panel>
</layout_stack>
<spinner label="Breite x Höhe" name="profile_snapshot_width"/>
<check_box label="Seitenverhältnis beibehalten" name="profile_keep_aspect_check"/>
<text name="caption_label">
Bildunterschrift:
</text>
<check_box initial_value="true" label="Ort einschließen" name="add_location_cb"/>
<button label="Abbrechen" name="cancel_btn"/>
<button label="Posten" name="post_btn"/>
</panel>

View File

@ -2,7 +2,6 @@
<floater
positioning="cascading"
can_close="true"
can_resize="true"
help_topic="floater_facebook"
layout="topleft"
name="floater_facebook"
@ -10,23 +9,15 @@
single_instance="true"
reuse_instance="true"
title="POST TO FACEBOOK"
min_height="501"
min_height="462"
min_width="304"
height="482"
width="304">
<panel
height="482"
width="304"
visible="true"
name="background"
follows="all"
top="0"
left="0">
height="462"
width="272">
<tab_container
name="tabs"
tab_group="1"
tab_min_width="70"
tab_height="30"
tab_min_width="64"
tab_height="21"
tab_position="top"
top="7"
height="437"
@ -57,23 +48,19 @@
follows="all"
label="FRIENDS"
name="panel_facebook_friends"/>
<panel
<!--<panel
filename="panel_facebook_account.xml"
class="llfacebookaccountpanel"
follows="all"
label="ACCOUNT"
name="panel_facebook_account"/>
name="panel_facebook_account"/>-->
</tab_container>
<panel
name="connection_status_panel"
follows="left|bottom|right"
height="24">
<text
name="connection_error_text"
type="string"
follows="left|bottom|right"
top="5"
left="9"
bottom="-5"
left="10"
width="250"
height="20"
wrap="true"
@ -88,14 +75,14 @@
height="24"
width="24"
name="connection_loading_indicator"
top="2"
left="9"
top_delta="-2"
left="10"
visible="true"/>
<text
name="connection_loading_text"
type="string"
follows="left|bottom|right"
top="5"
top_delta="2"
left_pad="5"
width="250"
height="20"
@ -106,6 +93,4 @@
font="SansSerif">
Loading...
</text>
</panel>
</panel>
</floater>

View File

@ -10,11 +10,11 @@
single_instance="true"
reuse_instance="true"
title="UPLOAD TO FLICKR"
height="622"
width="304">
height="590"
width="272">
<panel
height="622"
width="304"
height="590"
width="272"
visible="true"
name="background"
follows="all"
@ -24,10 +24,11 @@
name="tabs"
tab_group="1"
tab_min_width="70"
tab_height="30"
tab_height="21"
tab_position="top"
top="7"
height="577"
height="555"
follows="all"
halign="center"
use_highlighting_on_hover="true">
<panel
@ -51,8 +52,8 @@
name="connection_error_text"
type="string"
follows="left|bottom|right"
top="5"
left="9"
bottom="-5"
left="10"
width="250"
height="20"
wrap="true"
@ -67,14 +68,14 @@
height="24"
width="24"
name="connection_loading_indicator"
top="2"
left="9"
top_delta="-2"
left="10"
visible="true"/>
<text
name="connection_loading_text"
type="string"
follows="left|bottom|right"
top="5"
top_delta="2"
left_pad="5"
width="250"
height="20"

View File

@ -2,7 +2,7 @@
<floater
legacy_header_height="18"
can_minimize="false"
height="408"
height="440"
layout="topleft"
name="Inventory Finder"
help_topic="inventory_finder"
@ -93,23 +93,6 @@
name="check_landmark"
top_delta="0"
width="126" />
<icon
height="16"
image_name="Inv_Mesh"
layout="topleft"
left="8"
mouse_opaque="true"
name="icon_mesh"
top="142"
width="16" />
<check_box
height="16"
label="Meshes"
layout="topleft"
left_pad="2"
name="check_mesh"
top_delta="0"
width="126" />
<icon
height="16"
image_name="Inv_Notecard"
@ -127,6 +110,23 @@
name="check_notecard"
top_delta="0"
width="126" />
<icon
height="16"
image_name="Inv_Mesh"
layout="topleft"
left="8"
mouse_opaque="true"
name="icon_mesh"
top="142"
width="16" />
<check_box
height="16"
label="Meshes"
layout="topleft"
left_pad="2"
name="check_mesh"
top_delta="0"
width="126" />
<icon
height="16"
image_name="Inv_Object"
@ -223,25 +223,33 @@
top="262"
width="100" />
<button
follows="left|top"
height="20"
label="None"
label_selected="None"
layout="topleft"
left_delta="0"
name="None"
top_pad="4"
left_pad="10"
width="100" />
<check_box
height="16"
label="Always show folders"
layout="topleft"
left_delta="0"
left="8"
name="check_show_empty"
top_pad="4"
top_pad="6"
width="144" />
<view_border
bevel_style="none"
follows="top|left"
height="0"
layout="topleft"
left="10"
name="horiz_separator"
top_pad="8"
width="260"/>
<check_box
height="16"
top="324"
label="Since Logoff"
layout="topleft"
left_delta="0"
@ -257,36 +265,74 @@
layout="topleft"
left_delta="0"
name="- OR -"
top_delta="16"
top="342"
width="144">
- OR -
</text>
<radio_group
height="16"
layout="topleft"
name="date_search_direction"
top="360"
left="8"
width="270">
<radio_item
label="Newer than"
layout="topleft"
name="newer"
top_pad="6"
left="0" />
<radio_item
label="Older than"
layout="topleft"
name="older"
top_delta="0"
left="120" />
</radio_group>
<spinner
follows="left|top"
height="16"
increment="1"
initial_value="0"
layout="topleft"
left_delta="0"
max_val="240000"
name="spin_hours_ago"
top_pad="4"
width="64" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left_pad="3"
top_delta="4"
width="80">
Hours
</text>
<spinner
follows="left|top"
height="16"
increment="1"
initial_value="0"
label="Hours Ago"
label_width="64"
layout="topleft"
left_delta="0"
max_val="240000"
name="spin_hours_ago"
top_pad="4"
width="144" />
<spinner
follows="left|top"
height="16"
increment="1"
initial_value="0"
label="Days Ago"
label_width="64"
layout="topleft"
left_delta="0"
max_val="10000"
name="spin_days_ago"
top_pad="4"
width="144" />
left="8"
width="64" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left_pad="3"
top_delta="4"
width="80">
Days
</text>
<button
follows="top|right"
height="20"
@ -295,6 +341,6 @@
layout="topleft"
name="Close"
right="-6"
top="382"
top="406"
width="76" />
</floater>

View File

@ -3,15 +3,17 @@
positioning="cascading"
legacy_header_height="18"
can_minimize="true"
can_resize="false"
can_close="true"
height="500"
height="455"
layout="topleft"
name="Snapshot"
help_topic="snapshot"
save_rect="true"
save_visibility="false"
title="SNAPSHOT"
width="470">
width="624"
min_height="455">
<floater.string
name="unknown">
unknown
@ -57,11 +59,11 @@
Saved to Computer!
</string>
<string
name="facebook_failed_str">
name="facebook_failed_str">
Failed to upload image to your Facebook timeline.
</string>
<string
name="profile_failed_str">
name="profile_failed_str">
Failed to upload image to your Profile Feed.
</string>
<string
@ -78,188 +80,177 @@
</string>
<button
follows="left|top"
height="23"
image_overlay="TabIcon_Close_Off"
height="25"
image_overlay="Refresh_Off"
image_hover_unselected="Toolbar_Middle_Over"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
image_overlay_alignment="left"
imgoverlay_label_space="5"
pad_bottom="0"
halign="left"
layout="topleft"
left="236"
name="advanced_options_btn"
tool_tip="Advanced options"
top="25"
width="23" />
<ui_ctrl
height="160"
width="250"
layout="topleft"
name="thumbnail_placeholder"
top="50"
follows="left|top"
left="10">
<panel
background_visible="true"
bg_alpha_color="0.9 1 0.9 1"
left="10"
label="REFRESH"
name="new_snapshot_btn"
top_pad="26"
width="167" />
<button
follows="left|top"
font="SansSerifLarge"
halign="center"
height="20"
control_name="AdvanceSnapshot"
invisibility_control="AdvanceSnapshot"
height="25"
is_toggle="true"
layout="topleft"
left="0"
length="1"
name="succeeded_panel"
right="-1"
top="0"
type="string"
visible="false">
<text
follows="all"
font="SansSerif"
halign="center"
height="18"
layout="topleft"
left="1"
length="1"
name="succeeded_lbl"
right="-1"
text_color="0.2 0.5 0.2 1"
top="4"
translate="false"
type="string">
Succeeded
</text>
</panel>
<panel
background_visible="true"
bg_alpha_color="1 0.9 0.9 1"
image_hover_unselected="Toolbar_Middle_Over"
image_selected="Toolbar_Middle_Off"
image_unselected="Toolbar_Middle_Off"
image_overlay="Conv_toolbar_expand"
name="retract_btn"
left_pad="1"
top_delta="0"
width="31" />
<button
follows="left|top"
font="SansSerifLarge"
halign="center"
height="20"
control_name="AdvanceSnapshot"
visibility_control="AdvanceSnapshot"
height="25"
is_toggle="true"
layout="topleft"
image_overlay="Conv_toolbar_collapse"
image_hover_unselected="Toolbar_Middle_Over"
image_selected="Toolbar_Middle_Off"
image_unselected="Toolbar_Middle_Off"
name="extend_btn"
left_delta="0"
length="1"
name="failed_panel"
right="-1"
top="0"
type="string"
visible="false">
<text
follows="all"
font="SansSerif"
halign="center"
height="18"
layout="topleft"
left="1"
length="1"
name="failed_lbl"
right="-1"
text_color="0.5 0.2 0.2 1"
top="4"
translate="false"
type="string">
Failed
</text>
</panel>
<loading_indicator
follows="left|top"
height="48"
layout="topleft"
name="working_indicator"
left="101"
top="46"
visible="false"
width="48" />
<text
follows="left|top|right"
font="SansSerifBold"
height="14"
layout="topleft"
left="5"
length="1"
halign="center"
name="working_lbl"
right="-5"
top="98"
translate="false"
type="string"
visible="false"
width="130">
Working
</text>
<button
follows="left|top"
height="22"
image_overlay="Refresh_Off"
layout="topleft"
left="20"
name="new_snapshot_btn"
bottom="-20"
visible="false"
width="22" />
<text
follows="left|top"
font="SansSerifBold"
halign="left"
height="18"
layout="topleft"
left_pad="10"
length="1"
name="refresh_lbl"
right="-5"
text_color="red"
top_delta="0"
translate="false"
type="string"
visible="false"
width="130">
Refresh to save.
</text>
</ui_ctrl>
<view_border
bevel_style="in"
height="21"
width="250"
layout="topleft"
name="img_info_border"
top_pad="3"
follows="left|top"
left_delta="0"
/>
<text
type="string"
font="SansSerifSmall"
length="1"
follows="left|top"
height="14"
layout="topleft"
left_delta="5"
halign="left"
name="image_res_text"
top_delta="5"
width="100">
[WIDTH] x [HEIGHT] px
</text>
<text
follows="left|top"
font="SansSerifSmall"
height="14"
layout="topleft"
left="200"
length="1"
halign="right"
name="file_size_label"
top_delta="0"
type="string"
width="50">
[SIZE] KB
</text>
<panel_container
top_delta="0"
width="31" />
<panel
height="154"
layout="topleft"
follows="top|left"
left="0"
name="advanced_options_panel"
top_pad="-6"
width="210">
<view_border
bevel_style="in"
follows="left|top|right"
height="1"
left="10"
layout="topleft"
name="advanced_options_hr"
right="-1"
top_pad="5"
/>
<text
type="string"
length="1"
follows="left|top"
height="13"
layout="topleft"
left="10"
name="layer_type_label"
top_pad="10"
width="100">
Capture:
</text>
<combo_box
follows="left|top|right"
height="23"
label="Image Layers"
layout="topleft"
left="30"
name="layer_types"
right="-2">
<combo_box.item
label="Colors"
name="Colors"
value="colors" />
<combo_box.item
label="Depth"
name="Depth"
value="depth" />
</combo_box>
<check_box
label="Interface"
layout="topleft"
left="30"
height="16"
top_pad="8"
width="180"
name="ui_check" />
<check_box
label="HUDs"
layout="topleft"
height="16"
left="30"
top_pad="1"
width="180"
name="hud_check" />
<check_box
label="Freeze frame (fullscreen)"
layout="topleft"
height="16"
left="10"
top_pad="1"
width="180"
name="freeze_frame_check" />
<check_box
label="Auto-refresh"
layout="topleft"
height="16"
left="10"
top_pad="1"
width="180"
name="auto_snapshot_check" />
<text
type="string"
length="1"
follows="left|top"
height="13"
layout="topleft"
left="10"
name="filter_list_label"
top_pad="10"
width="50">
Filter:
</text>
<combo_box
control_name="PhotoFilters"
follows="left|right|top"
name="filters_combobox"
tool_tip="Image filters"
top_delta="-3"
left="50"
right="-1"
height="21"
width="135">
<combo_box.item
label="No Filter"
name="NoFilter"
value="NoFilter" />
</combo_box>
<view_border
bevel_style="in"
follows="left|top|right"
height="1"
left="10"
layout="topleft"
name="advanced_options_hr"
right="-1"
top_pad="7"
/>
</panel>
<panel_container
follows="left|top"
height="260"
height="230"
layout="topleft"
left="0"
name="panel_container"
default_panel_name="panel_snapshot_options"
top_pad="10"
width="270">
width="215">
<panel
class="llpanelsnapshotoptions"
filename="panel_snapshot_options.xml"
@ -293,119 +284,163 @@
name="panel_snapshot_local"
filename="panel_snapshot_local.xml" />
</panel_container>
<panel
height="295"
layout="topleft"
left="270"
name="advanced_options_panel"
top="20"
width="200">
<text
type="string"
font="SansSerifSmall"
length="1"
follows="left|top"
height="14"
layout="topleft"
left="10"
halign="left"
name="advanced_options_label"
right="-10"
top="10">
ADVANCED OPTIONS
</text>
<view_border
<view_border
bevel_style="in"
follows="left|top|right"
follows="left|top"
height="1"
left="10"
layout="topleft"
name="advanced_options_hr"
right="-10"
top_pad="5"
/>
<text
type="string"
length="1"
follows="left|top"
height="13"
layout="topleft"
left="10"
name="layer_type_label"
top_pad="10"
width="50">
Capture:
</text>
<combo_box
follows="left|top|right"
height="23"
label="Image Layers"
layout="topleft"
left="30"
name="layer_types"
right="-10">
<combo_box.item
label="Colors"
name="Colors"
value="colors" />
<combo_box.item
label="Depth"
name="Depth"
value="depth" />
</combo_box>
<check_box
label="Interface"
layout="topleft"
left="30"
top_pad="10"
width="180"
name="ui_check" />
<check_box
label="HUDs"
layout="topleft"
left="30"
top_pad="10"
width="180"
name="hud_check" />
<check_box
label="Freeze frame (fullscreen)"
layout="topleft"
left="10"
top_pad="8"
width="180"
name="freeze_frame_check" />
<check_box
label="Auto-refresh"
layout="topleft"
left="10"
top_pad="8"
width="180"
name="auto_snapshot_check" />
<text
type="string"
length="1"
follows="left|top"
height="13"
layout="topleft"
left="10"
name="filter_list_label"
top_pad="10"
width="50">
Filter:
</text>
<combo_box
control_name="PhotoFilters"
follows="left|right|top"
name="filters_combobox"
tool_tip="Image filters"
top_pad="8"
left="30"
height="21"
width="135">
<combo_box.item
label="No Filter"
name="NoFilter"
value="NoFilter" />
</combo_box>
</panel>
name="status_hr"
width="199"
top_pad="-16"/>
<panel
background_visible="false"
follows="left|top"
font="SansSerifLarge"
halign="center"
height="20"
layout="topleft"
left="10"
length="1"
name="succeeded_panel"
width="198"
top_pad="1"
type="string"
visible="false">
<text
follows="all"
font="SansSerif"
halign="center"
height="18"
layout="topleft"
left="1"
length="1"
name="succeeded_lbl"
right="-1"
text_color="0.2 0.85 0.2 1"
top="4"
translate="false"
type="string">
Succeeded
</text>
</panel>
<panel
background_visible="false"
follows="left|top"
font="SansSerifLarge"
halign="center"
height="20"
layout="topleft"
left="10"
length="1"
name="failed_panel"
width="198"
top_delta="0"
type="string"
visible="false">
<text
follows="all"
font="SansSerif"
halign="center"
height="18"
layout="topleft"
left="1"
length="1"
name="failed_lbl"
right="-1"
text_color="0.95 0.4 0.4 1"
top="4"
translate="false"
type="string">
Failed
</text>
</panel>
<loading_indicator
follows="left|top"
height="24"
layout="topleft"
name="working_indicator"
left="10"
top_delta="0"
visible="false"
width="24" />
<text
follows="left|top"
font="SansSerifBold"
height="14"
layout="topleft"
left_pad="3"
length="1"
halign="left"
name="working_lbl"
top_delta="5"
translate="false"
type="string"
visible="false"
width="162">
Working
</text>
<text
follows="left|top"
font="SansSerifBold"
halign="left"
height="18"
layout="topleft"
left="10"
length="1"
name="refresh_lbl"
text_color="0.95 0.4 0.4 1"
top_delta="0"
translate="false"
type="string"
visible="false"
width="130">
Refresh to save.
</text>
<ui_ctrl
layout="topleft"
name="thumbnail_placeholder"
top="23"
left="215"
width="400"
height="400"
follows="top|left"/>
<view_border
bevel_style="in"
height="21"
layout="topleft"
name="img_info_border"
top_pad="0"
right="-10"
follows="left|top|right"
left_delta="0"/>
<text
type="string"
font="SansSerifSmall"
length="1"
follows="left|top|right"
height="14"
layout="topleft"
left="220"
right="-20"
halign="left"
name="image_res_text"
top_delta="5"
width="200">
[WIDTH]px (width) x [HEIGHT]px (height)
</text>
<text
follows="right|top"
font="SansSerifSmall"
height="14"
layout="topleft"
left="-65"
length="1"
halign="right"
name="file_size_label"
top_delta="0"
type="string"
width="50">
[SIZE] KB
</text>
</floater>

View File

@ -38,6 +38,18 @@
name="none_descriptor">
None found.
</floater.string>
<floater.string
name="URLs">
URLs
</floater.string>
<floater.string
name="memory">
Memory (KB)
</floater.string>
<text
type="string"
length="1"
@ -82,7 +94,7 @@
name="parcel"
width="120" />
<scroll_list.columns
label="Time"
label="Date"
name="time"
width="130" />
<scroll_list.columns

View File

@ -10,21 +10,13 @@
single_instance="true"
reuse_instance="true"
title="TWITTER"
height="502"
width="304">
<panel
height="502"
width="304"
visible="true"
name="background"
follows="all"
top="0"
left="0">
height="462"
width="272">
<tab_container
name="tabs"
tab_group="1"
tab_min_width="70"
tab_height="30"
tab_height="21"
tab_position="top"
top="7"
height="457"
@ -43,17 +35,13 @@
label="ACCOUNT"
name="panel_twitter_account"/>
</tab_container>
<panel
name="connection_status_panel"
follows="left|bottom|right"
height="24">
<text
name="connection_error_text"
type="string"
follows="left|bottom|right"
top="5"
left="9"
width="250"
bottom="-5"
left="10"
width="252"
height="20"
wrap="true"
halign="left"
@ -67,16 +55,16 @@
height="24"
width="24"
name="connection_loading_indicator"
top="2"
left="9"
top_delta="-2"
left="10"
visible="true"/>
<text
name="connection_loading_text"
type="string"
follows="left|bottom|right"
top="5"
top_delta="2"
left_pad="5"
width="250"
width="223"
height="20"
wrap="true"
halign="left"
@ -85,6 +73,4 @@
font="SansSerif">
Loading...
</text>
</panel>
</panel>
</floater>

View File

@ -63,7 +63,7 @@
<menu_item_separator
layout="topleft" />
<menu_item_call
label="Show Filters"
label="Show Filters..."
layout="topleft"
name="show_filters">
<on_click

View File

@ -167,6 +167,16 @@ No tutorial is currently available.
yestext="Yes"/>
</notification>
<notification
icon="alertmodal.tga"
name="GenericAlertOK"
type="alertmodal">
[MESSAGE]
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="BadInstallation"
@ -4726,6 +4736,17 @@ The region you're trying to visit contains [REGIONMATURITY] content, but your cu
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="RegionTPSpecialUsageBlocked"
type="alertmodal">
<tag>fail</tag>
Unable to enter region. '[REGION_NAME]' is a Skill Gaming Region, and you must meet certain criteria in order to enter. For details, please review the [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ].
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="PreferredMaturityChanged"

View File

@ -1,77 +0,0 @@
<panel
height="400"
width="304"
layout="topleft"
follows="all"
name="panel_facebook_account">
<string
name="facebook_connected"
value="You are connected to Facebook as:" />
<string
name="facebook_disconnected"
value="Not connected to Facebook" />
<text
layout="topleft"
length="1"
follows="top|left"
font="SansSerif"
height="16"
left="9"
name="account_caption_label"
top="21"
type="string">
Not connected to Facebook.
</text>
<text
layout="topleft"
top_pad="2"
length="1"
follows="top|left"
font="SansSerif"
height="16"
left="9"
name="account_name_label"
parse_urls="true"
type="string"/>
<panel
layout="topleft"
follows="left|top"
name="panel_buttons"
height="345"
left="9">
<button
layout="topleft"
follows="left|top"
top_pad="9"
visible="true"
height="23"
label="Connect..."
name="connect_btn"
width="210">
<commit_callback function="SocialSharing.Connect"/>
</button>
<button
layout="topleft"
follows="left|top"
top_delta="0"
height="23"
label="Disconnect"
name="disconnect_btn"
width="210"
visible="false">
<commit_callback function="SocialSharing.Disconnect"/>
</button>
<text
layout="topleft"
length="1"
follows="top|left"
height="16"
left="0"
name="account_learn_more_label"
top_pad="20"
type="string">
[http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Learn about posting to Facebook]
</text>
</panel>
</panel>

View File

@ -1,6 +1,6 @@
<panel
height="400"
width="304"
width="272"
layout="topleft"
follows="all"
name="panel_facebook_friends">
@ -9,17 +9,17 @@
value="You currently do not have any Facebook friends who are also Second Life residents. Ask your Facebook friends to join Second Life today!" />
<string
name="facebook_friends_no_connected"
value="You're currently not connected to Facebook. Please go to the Account tab to connect and enable this feature." />
value="You're currently not connected to Facebook. Please go to the Status tab to connect and enable this feature." />
<accordion
background_visible="true"
background_visible="false"
bg_alpha_color="DkGray2"
bg_opaque_color="DkGray2"
follows="all"
height="408"
height="383"
layout="topleft"
left="3"
left="10"
name="friends_accordion"
right="-2"
right="-10"
top_pad="2">
<accordion_tab
layout="topleft"
@ -36,7 +36,7 @@
name="second_life_friends"
show_permissions_granted="true"
top="0"
width="307" />
width="272" />
</accordion_tab>
<accordion_tab
layout="topleft"
@ -53,19 +53,20 @@
name="suggested_friends"
show_permissions_granted="true"
top="0"
width="307" />
width="272" />
</accordion_tab>
</accordion>
<text
layout="topleft"
word_wrap="true"
height="64"
width="290"
width="250"
follows="top|left|right"
font="SansSerif"
left="9"
left="10"
right="-10"
name="facebook_friends_status"
top="21"
top="5"
type="string">
Not connected to Facebook.
</text>

View File

@ -1,29 +1,19 @@
<panel
height="400"
width="304"
width="272"
layout="topleft"
follows="all"
name="panel_facebook_photo">
<layout_stack
layout="topleft"
border_size="0"
height="392"
follows="all"
orientation="vertical"
name="stack_photo"
top="8">
<layout_panel
name="snapshot_panel"
height="367">
<combo_box
control_name="FacebookPhotoResolution"
follows="left|top"
top="6"
left="9"
layout="topleft"
top="7"
left="10"
name="resolution_combobox"
tool_tip="Image resolution"
height="21"
width="135">
width="124">
<combo_box.item
label="Current Window"
name="CurrentWindow"
@ -47,13 +37,14 @@
</combo_box>
<combo_box
control_name="FacebookPhotoFilters"
follows="right|top"
follows="left|top"
layout="topleft"
name="filters_combobox"
tool_tip="Image filters"
top="6"
left="165"
top="7"
left_pad="4"
height="21"
width="135">
width="124">
<combo_box.item
label="No Filter"
name="NoFilter"
@ -61,18 +52,47 @@
</combo_box>
<panel
height="150"
width="250"
width="252"
visible="true"
layout="topleft"
name="thumbnail_placeholder"
top="33"
follows="left|top|right"
left="9">
top_pad="5"
follows="left|top|rith"
right="-10"
left="10">
</panel>
<text
follows="left|top"
layout="topleft"
font="SansSerif"
text_color="EmphasisColor"
height="14"
top_pad="2"
left="10"
length="1"
halign="center"
name="working_lbl"
translate="false"
type="string"
visible="true"
width="251">
Refreshing...
</text>
<view_border
bevel_style="in"
follows="left|top"
layout="topleft"
height="1"
left="10"
name="refresh_border"
width="250"
top_pad="0"/>
<button
follows="left|top"
layout="topleft"
height="23"
label="Refresh"
left="9"
left="10"
top_pad="5"
name="new_snapshot_btn"
tool_tip="Click to refresh"
@ -81,28 +101,13 @@
<button.commit_callback
function="SocialSharing.RefreshPhoto" />
</button>
<text
follows="left|top"
font="SansSerif"
text_color="EmphasisColor"
height="14"
top_pad="-19"
left_pad="-30"
length="1"
halign="center"
name="working_lbl"
translate="false"
type="string"
visible="true"
width="150">
Refreshing...
</text>
<button
follows="right|top"
layout="topleft"
height="23"
label="Preview"
left="200"
top_pad="-19"
right="-10"
top_delta="0"
name="big_preview_btn"
tool_tip="Click to toggle preview"
is_toggle="true"
@ -114,9 +119,10 @@
<text
length="1"
follows="top|left|right"
layout="topleft"
font="SansSerif"
height="16"
left="9"
left="10"
name="caption_label"
top_pad="20"
type="string">
@ -124,23 +130,22 @@
</text>
<text_editor
follows="left|top|right|bottom"
layout="topleft"
height="87"
width="250"
left="9"
left="10"
right="-10"
length="1"
max_length="700"
name="photo_caption"
type="string"
word_wrap="true">
</text_editor>
</layout_panel>
<layout_panel
name="photo_button_panel"
height="25">
<button
follows="left|bottom"
top="0"
left="9"
follows="left|top"
layout="topleft"
top_pad="22"
left="10"
height="23"
label="Post"
name="post_photo_btn"
@ -149,16 +154,15 @@
function="SocialSharing.SendPhoto" />
</button>
<button
follows="left|bottom"
follows="right|top"
layout="topleft"
height="23"
label="Cancel"
name="cancel_photo_btn"
left_pad="15"
right="-10"
top_delta="0"
width="100">
<button.commit_callback
function="SocialSharing.Cancel" />
</button>
</layout_panel>
</layout_stack>
</button>
</panel>

View File

@ -1,115 +1,96 @@
<panel
height="400"
width="304"
width="272"
layout="topleft"
follows="all"
name="panel_facebook_place">
<layout_stack
layout="topleft"
border_size="0"
height="392"
follows="all"
orientation="vertical"
name="stack_place"
top="8">
<layout_panel
name="place_detail_panel"
height="181">
<text
length="1"
follows="top|left|right"
layout="topleft"
font="SansSerif"
height="16"
left="9"
left="10"
name="place_caption_label"
top="13"
top="5"
type="string">
Say something about where you are:
</text>
<text_editor
follows="top|left|right"
height="150"
layout="topleft"
height="70"
width="250"
left="9"
left="10"
right="-10"
length="1"
max_length="700"
name="place_caption"
type="string"
word_wrap="true">
</text_editor>
</layout_panel>
<layout_panel
name="place_map_panel"
height="186">
<check_box
follows="left|top"
layout="topleft"
initial_value="false"
height="16"
top_pad="8"
width="8"
label="Include overhead view of location"
name="add_place_view_cb"
left="10"/>
<panel
follows="left|top"
height="128"
width="128"
layout="topleft"
height="243"
width="250"
background_visible="true"
bg_opaque_color="Black"
bg_alpha_color="Black"
top="20"
left="9"
top_pad="8"
left="10"
right="-12"
visible="true"
name="map_border">
</panel>
<loading_indicator
follows="left|top"
height="24"
width="24"
name="map_loading_indicator"
top="77"
left="61"
visible="true"/>
<icon
follows="left|top"
height="128"
width="128"
layout="topleft"
height="243"
width="250"
image_name="Map_Placeholder_Icon"
layout="topleft"
top="20"
left="9"
top_delta="0"
right="-12"
left="10"
visible="true"
name="map_placeholder">
</icon>
<icon
follows="left|top"
height="128"
width="128"
layout="topleft"
height="243"
width="250"
image_name="Map_Placeholder_Icon"
layout="topleft"
top="20"
left="9"
top_delta="0"
left="10"
right="-12"
visible="true"
name="map_default">
</icon>
<check_box
<loading_indicator
follows="left|top"
initial_value="false"
top_delta="8"
width="8"
label=""
name="add_place_view_cb"
left_pad="5"/>
<text
follows="left|top"
font="SansSerif"
height="32"
width="130"
word_wrap="true"
left_pad="12"
top_delta="-8"
type="string">
Include overhead view of location
</text>
</layout_panel>
<layout_panel
name="place_button_panel"
height="25">
layout="topleft"
height="24"
width="24"
name="map_loading_indicator"
top_delta="116"
left="126"
visible="false"/>
<button
follows="left|bottom"
top="0"
left="9"
layout="topleft"
top_pad="95"
left="10"
height="23"
label="Post"
name="post_place_btn"
@ -118,16 +99,15 @@
function="SocialSharing.SendCheckin" />
</button>
<button
follows="left|bottom"
follows="right|bottom"
layout="topleft"
height="23"
label="Cancel"
name="cancel_place_btn"
left_pad="15"
right="-10"
top_delta="0"
width="100">
<button.commit_callback
function="SocialSharing.Cancel" />
</button>
</layout_panel>
</layout_stack>
</panel>

View File

@ -1,50 +1,113 @@
<panel
height="400"
width="304"
width="272"
follows="all"
layout="topleft"
name="panel_facebook_status">
<layout_stack
<string
name="facebook_connected"
value="You are connected to Facebook as:" />
<string
name="facebook_disconnected"
value="Not connected to Facebook" />
<text
layout="topleft"
length="1"
follows="top|left"
font="SansSerif"
height="16"
left="10"
name="account_caption_label"
top="5"
type="string">
Not connected to Facebook.
</text>
<text
layout="topleft"
top_pad="2"
length="1"
follows="top|left"
font="SansSerif"
height="16"
left="10"
name="account_name_label"
parse_urls="true"
type="string"/>
<panel
layout="topleft"
follows="left|top"
name="panel_buttons"
height="60"
left="0">
<button
layout="topleft"
follows="left|top"
top_pad="9"
left="10"
visible="true"
height="23"
label="Connect..."
name="connect_btn"
width="251">
<commit_callback function="SocialSharing.Connect"/>
</button>
<button
layout="topleft"
follows="left|top|right"
top_delta="0"
left="10"
right="-10"
height="23"
label="Disconnect"
name="disconnect_btn"
width="210"
visible="false">
<commit_callback function="SocialSharing.Disconnect"/>
</button>
<text
layout="topleft"
border_size="0"
height="392"
follows="all"
orientation="vertical"
name="stack_status"
top="8">
<layout_panel
name="status_detail_panel"
height="367">
length="1"
follows="top|left|right"
left="10"
right="-10"
height="16"
name="account_learn_more_label"
top_pad="5"
type="string">
[http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Learn about posting to Facebook]
</text>
</panel>
<text
length="1"
layout="topleft"
follows="top|left|right"
font="SansSerif"
height="16"
left="9"
left="10"
name="status_caption_label"
top="13"
top_pad="5"
type="string">
What's on your mind?
</text>
<text_editor
follows="left|top|right"
layout="topleft"
height="150"
width="250"
left="9"
width="252"
left="10"
length="1"
max_length="700"
name="status_message"
type="string"
word_wrap="true">
</text_editor>
</layout_panel>
<layout_panel
name="status_button_panel"
height="25">
<button
follows="left|bottom"
top="0"
left="9"
follows="left|top"
layout="topleft"
top_pad="6"
left="10"
height="23"
label="Post"
name="post_status_btn"
@ -53,16 +116,15 @@
function="SocialSharing.SendStatus" />
</button>
<button
follows="left|bottom"
follows="right|top"
layout="topleft"
height="23"
label="Cancel"
name="cancel_status_btn"
left_pad="15"
right="-10"
top_delta="0"
width="100">
<button.commit_callback
function="SocialSharing.Cancel" />
</button>
</layout_panel>
</layout_stack>
</panel>

View File

@ -1,6 +1,6 @@
<panel
height="540"
width="304"
width="272"
layout="topleft"
name="panel_flickr_account">
<string
@ -15,9 +15,9 @@
follows="top|left"
font="SansSerif"
height="16"
left="9"
left="10"
name="account_caption_label"
top="21"
top="5"
type="string">
Not connected to Flickr.
</text>
@ -28,7 +28,7 @@
follows="top|left"
font="SansSerif"
height="16"
left="9"
left="10"
name="account_name_label"
parse_urls="true"
type="string"/>
@ -36,12 +36,14 @@
layout="topleft"
name="panel_buttons"
height="345"
left="9">
left="0">
<button
layout="topleft"
follows="left|top"
follows="left|top|right"
top_pad="9"
visible="true"
left="10"
right="-10"
height="23"
label="Connect..."
name="connect_btn"
@ -51,8 +53,10 @@
<button
layout="topleft"
follows="left|top"
follows="left|top|right"
top_delta="0"
left="10"
right="-10"
height="23"
label="Disconnect"
name="disconnect_btn"
@ -65,9 +69,9 @@
length="1"
follows="top|left"
height="16"
left="0"
left="10"
name="account_learn_more_label"
top_pad="20"
top_pad="5"
type="string">
[http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Flickr/ta-p/2435609 Learn about posting to Flickr]
</text>

View File

@ -1,28 +1,19 @@
<panel
height="540"
width="304"
width="272"
follows="all"
layout="topleft"
name="panel_flickr_photo">
<layout_stack
layout="topleft"
border_size="0"
height="532"
follows="all"
orientation="vertical"
name="stack_photo"
top="8">
<layout_panel
name="snapshot_panel"
height="507">
<combo_box
control_name="FlickrPhotoResolution"
follows="left|top"
top="6"
left="9"
layout="topleft"
top="7"
left="10"
name="resolution_combobox"
tool_tip="Image resolution"
height="21"
width="135">
width="124">
<combo_box.item
label="Current Window"
name="CurrentWindow"
@ -42,13 +33,14 @@
</combo_box>
<combo_box
control_name="FlickrPhotoFilters"
follows="right|top"
follows="left|top"
layout="topleft"
name="filters_combobox"
tool_tip="Image filters"
top="6"
left="165"
top_delta="0"
left_pad="4"
height="21"
width="135">
width="124">
<combo_box.item
label="No Filter"
name="NoFilter"
@ -59,15 +51,44 @@
width="250"
visible="true"
name="thumbnail_placeholder"
top="33"
follows="left|top"
left="9">
top_pad="5"
follows="left|top|right"
layout="topleft"
right="-10"
left="10">
</panel>
<text
follows="left|top"
layout="topleft"
font="SansSerif"
text_color="EmphasisColor"
height="14"
top_pad="2"
left="10"
length="1"
halign="center"
name="working_lbl"
translate="false"
type="string"
visible="true"
width="251">
Refreshing...
</text>
<view_border
bevel_style="in"
follows="left|top"
layout="topleft"
height="1"
left="10"
name="refresh_border"
width="250"
top_pad="0"/>
<button
follows="left|top"
layout="topleft"
height="23"
label="Refresh"
left="9"
left="10"
top_pad="5"
name="new_snapshot_btn"
tool_tip="Click to refresh"
@ -76,28 +97,13 @@
<button.commit_callback
function="SocialSharing.RefreshPhoto" />
</button>
<text
follows="left|top"
font="SansSerif"
text_color="EmphasisColor"
height="14"
top_pad="-19"
left_pad="-30"
length="1"
halign="center"
name="working_lbl"
translate="false"
type="string"
visible="true"
width="150">
Refreshing...
</text>
<button
follows="right|top"
layout="topleft"
height="23"
label="Preview"
left="200"
top_pad="-19"
right="-10"
top_delta="0"
name="big_preview_btn"
tool_tip="Click to toggle preview"
is_toggle="true"
@ -109,19 +115,21 @@
<text
length="1"
follows="top|left|right"
layout="topleft"
font="SansSerif"
height="16"
left="9"
left="10"
name="title_label"
top_pad="15"
top_pad="10"
type="string">
Title:
</text>
<line_editor
follows="left|top"
layout="topleft"
height="20"
width="250"
left="9"
left="10"
length="1"
max_length="256"
name="photo_title"
@ -130,19 +138,23 @@
<text
length="1"
follows="top|left|right"
layout="topleft"
font="SansSerif"
height="16"
left="9"
left="10"
right="-10"
name="description_label"
top_pad="10"
width="25"
type="string">
Description:
</text>
<text_editor
follows="left|top"
layout="topleft"
height="50"
width="250"
left="9"
width="249"
left="10"
length="1"
max_length="700"
name="photo_description"
@ -151,6 +163,7 @@
</text_editor>
<check_box
follows="left|top"
layout="topleft"
initial_value="true"
label="Include SL location at end of description"
name="add_location_cb"
@ -159,23 +172,25 @@
top_pad="8"/>
<text
length="1"
follows="top|left|right"
follows="top|left"
layout="topleft"
font="SansSerif"
height="16"
left="9"
left="10"
name="tags_label"
top_pad="10"
top_pad="6"
type="string">
Tags:
</text>
<text
length="1"
follows="top|left"
layout="topleft"
font="SansSerifSmall"
text_color="White_50"
height="30"
name="tags_help_label"
left="50"
left="51"
top_pad="-16"
type="string">
Separate tags with spaces
@ -183,9 +198,10 @@ Use "" for multi-word tags
</text>
<text_editor
follows="left|top"
layout="topleft"
height="50"
width="250"
left="9"
width="249"
left="10"
length="1"
max_length="700"
name="photo_tags"
@ -195,8 +211,9 @@ Use "" for multi-word tags
<combo_box
control_name="FlickrPhotoRating"
follows="left|top"
top_pad="16"
left="9"
layout="topleft"
top_pad="7"
left="10"
name="rating_combobox"
tool_tip="Flickr content rating"
height="21"
@ -214,14 +231,11 @@ Use "" for multi-word tags
name="RestrictedRating"
value="3" />
</combo_box>
</layout_panel>
<layout_panel
name="photo_button_panel"
height="25">
<button
follows="left|top"
top="0"
left="9"
layout="topleft"
top_pad="7"
left="10"
height="23"
label="Upload"
name="post_photo_btn"
@ -230,16 +244,15 @@ Use "" for multi-word tags
function="SocialSharing.SendPhoto" />
</button>
<button
follows="left|top"
follows="right|top"
layout="topleft"
height="23"
label="Cancel"
name="cancel_photo_btn"
left_pad="15"
right="-10"
top_delta="0"
width="100">
<button.commit_callback
function="SocialSharing.Cancel" />
</button>
</layout_panel>
</layout_stack>
</button>
</panel>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
height="380"
height="319"
layout="topleft"
name="panel_postcard_message"
width="490">
@ -12,7 +12,7 @@
font="SansSerif"
height="16"
layout="topleft"
left="12"
left="5"
name="to_label"
top="10"
width="60">
@ -25,7 +25,7 @@
layout="topleft"
left_pad="10"
name="to_form"
right="-10"
right="-3"
top_delta="-4" />
<text
type="string"
@ -35,7 +35,7 @@
font="SansSerif"
height="16"
layout="topleft"
left="12"
left="5"
name="name_label"
width="60">
From:
@ -47,7 +47,7 @@
left_pad="10"
max_length_bytes="100"
name="name_form"
right="-10"
right="-3"
top_delta="-4" />
<text
type="string"
@ -57,7 +57,7 @@
font="SansSerif"
height="16"
layout="topleft"
left="12"
left="5"
name="subject_label"
width="60">
Subject:
@ -65,61 +65,24 @@
<line_editor
follows="left|top|right"
height="20"
label="Type your subject here."
layout="topleft"
left_pad="10"
max_length_bytes="100"
name="subject_form"
right="-10"
right="-3"
top_delta="-4" />
<text
type="string"
length="1"
bottom_delta="23"
follows="top|left|right"
font="SansSerif"
layout="topleft"
left="12"
name="msg_label"
right="-10">
Message:
</text>
<text_editor
type="string"
length="1"
follows="left|top|right"
height="60"
height="48"
layout="topleft"
left_delta="0"
left="5"
max_length="700"
name="msg_form"
right="-10"
top_pad="10"
right="-4"
top_pad="5"
word_wrap="true">
Type your message here.
</text_editor>
<button
follows="right|bottom"
height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
right="-32"
top="350"
width="100">
<button.commit_callback
function="Postcard.Cancel" />
</button>
<button
follows="right|bottom"
height="23"
label="Send"
layout="topleft"
left_delta="-106"
name="send_btn"
top_delta="0"
width="100">
<button.commit_callback
function="Postcard.Send" />
</button>
</panel>

View File

@ -9,10 +9,10 @@
height="23"
label="Resolution"
layout="topleft"
left="10"
left="5"
name="postcard_size_combo"
right="-10"
top_pad="10">
right="-3"
top_pad="5">
<combo_box.item
label="Current Window"
name="CurrentWindow"
@ -34,103 +34,55 @@
name="Custom"
value="[i-1,i-1]" />
</combo_box>
<layout_stack
animate="false"
follows="all"
height="275"
layout="bottomleft"
name="postcard_image_params_ls"
left_delta="0"
orientation="vertical"
top_pad="10"
right="-10">
<layout_panel
follows="top|left|right"
height="60"
layout="topleft"
left="0"
name="postcard_image_size_lp"
auto_resize="false"
top="0"
right="-1"
visible="true">
<spinner
allow_text_entry="false"
decimal_digits="0"
follows="left|top"
height="20"
increment="32"
label="Width"
label_width="40"
layout="topleft"
left="10"
max_val="6016"
min_val="32"
name="postcard_snapshot_width"
top_pad="10"
width="95" />
<spinner
allow_text_entry="false"
decimal_digits="0"
follows="left|top"
height="20"
increment="32"
label="Height"
label_width="40"
layout="topleft"
left_pad="5"
max_val="6016"
min_val="32"
name="postcard_snapshot_height"
top_delta="0"
width="95" />
<check_box
height="10"
bottom_delta="20"
follows="left|top"
label="Constrain proportions"
layout="topleft"
left="10"
name="postcard_keep_aspect_check" />
</layout_panel>
<layout_panel
follows="top|left|right"
height="23"
layout="topleft"
left="0"
name="postcard_image_format_quality_lp"
auto_resize="true"
top="0"
right="-1"
visible="true">
<slider
decimal_digits="0"
follows="left|top"
height="15"
increment="1"
initial_value="75"
label="Image quality"
label_width="80"
layout="topleft"
left="0"
max_val="100"
name="image_quality_slider"
top_pad="7"
width="190" />
<text
type="string"
follows="left|top"
font="SansSerifSmall"
length="1"
height="14"
layout="topleft"
left_pad="-5"
halign="left"
name="image_quality_level"
top_delta="0"
width="60">
([QLVL])
</text>
</layout_panel>
</layout_stack>
<spinner
allow_text_entry="false"
decimal_digits="0"
follows="left|top"
height="20"
increment="32"
label="Width x Height"
label_width="90"
layout="topleft"
left="5"
max_val="6016"
min_val="32"
name="postcard_snapshot_width"
top_pad="5"
width="144" />
<spinner
allow_text_entry="false"
decimal_digits="0"
follows="left|top"
height="20"
increment="32"
label=""
label_width="0"
layout="topleft"
left_pad="0"
max_val="6016"
min_val="32"
name="postcard_snapshot_height"
top_delta="0"
width="52" />
<check_box
top_pad="12"
follows="left|top"
label="Constrain proportions"
layout="topleft"
left="5"
name="postcard_keep_aspect_check" />
<slider
decimal_digits="0"
follows="left|top"
height="15"
increment="1"
initial_value="75"
label="Quality:"
label_width="45"
layout="topleft"
left="5"
max_val="100"
name="image_quality_slider"
top_pad="6"
width="190" />
</panel>

View File

@ -12,12 +12,12 @@
left="12"
mouse_opaque="true"
name="title_icon"
top="5"
top="6"
width="18" />
<text
follows="top|left|right"
font="SansSerifBold"
height="20"
height="14"
layout="topleft"
left_pad="12"
length="1"
@ -25,46 +25,28 @@
right="-10"
text_color="white"
type="string"
top_delta="5">
Save to My Inventory
top_delta="3">
Inventory
</text>
<view_border
bevel_style="in"
follows="left|top|right"
height="1"
left="10"
left="9"
layout="topleft"
name="hr"
right="-10"
right="-5"
top_pad="5"
/>
<text
bottom="35"
follows="top|left|right"
font="SansSerif"
height="56"
layout="topleft"
left="12"
length="1"
name="hint_lbl"
top_pad="10"
type="string"
word_wrap="true">
Saving an image to your inventory costs L$[UPLOAD_COST]. To save your image as a texture select one of the square formats.
</text>
<combo_box
follows="top|left|right"
height="23"
height="20"
label="Resolution"
layout="topleft"
left_delta="0"
name="texture_size_combo"
right="-10"
top_pad="10">
<combo_box.item
label="Current Window"
name="CurrentWindow"
value="[i0,i0]" />
right="-5"
top_pad="5">
<combo_box.item
label="Small (128x128)"
name="Small(128x128)"
@ -88,61 +70,74 @@
follows="left|top"
height="20"
increment="32"
label="Width"
label_width="40"
label="Width x Height"
label_width="90"
layout="topleft"
left="10"
max_val="6016"
min_val="32"
name="inventory_snapshot_width"
top_pad="10"
width="95" />
top_pad="7"
width="144" />
<spinner
allow_text_entry="false"
decimal_digits="0"
follows="left|top"
height="20"
increment="32"
label="Height"
label_width="40"
label=""
label_width="0"
layout="topleft"
left_pad="5"
left_pad="0"
max_val="6016"
min_val="32"
name="inventory_snapshot_height"
top_delta="0"
width="95" />
width="54" />
<check_box
bottom_delta="20"
height="10"
top_pad="12"
follows="left|top"
label="Constrain proportions"
layout="topleft"
left="10"
name="inventory_keep_aspect_check"
visible="false" />
<text
follows="top|left"
font="SansSerif"
height="56"
layout="topleft"
left="10"
length="1"
name="hint_lbl"
top_pad="6"
width="200"
type="string"
word_wrap="true">
Saving an image to your inventory costs L$[UPLOAD_COST]. To save your image as a texture select one of the square formats.
</text>
<button
follows="right|bottom"
height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
right="-32"
top="350"
width="100">
right="-5"
top="337"
width="97">
<button.commit_callback
function="Inventory.Cancel" />
</button>
<button
follows="right|bottom"
follows="left|bottom"
height="23"
label="Save"
layout="topleft"
left_delta="-106"
left="10"
name="save_btn"
top_delta="0"
width="100">
width="97">
<button.commit_callback
function="Inventory.Save" />
</button>
</panel>
</panel>

View File

@ -12,12 +12,12 @@
left="12"
mouse_opaque="true"
name="title_icon"
top="5"
top="7"
width="18" />
<text
follows="top|left|right"
font="SansSerifBold"
height="20"
height="14"
layout="topleft"
left_pad="12"
length="1"
@ -25,28 +25,27 @@
right="-10"
text_color="white"
type="string"
top_delta="4">
Save to My Computer
top_delta="2">
Disk
</text>
<view_border
bevel_style="in"
follows="left|top|right"
height="1"
left="10"
left="9"
layout="topleft"
name="hr"
right="-10"
top_pad="5"
/>
right="-5"
top_pad="5"/>
<combo_box
follows="left|top|right"
height="23"
height="20"
label="Resolution"
layout="topleft"
left_delta="0"
name="local_size_combo"
right="-10"
top_pad="10">
right="-5"
top_pad="5">
<combo_box.item
label="Current Window"
name="CurrentWindow"
@ -80,149 +79,114 @@
name="Custom"
value="[i-1,i-1]" />
</combo_box>
<layout_stack
animate="false"
follows="all"
height="275"
layout="bottomleft"
name="local_image_params_ls"
left_delta="0"
orientation="vertical"
top_pad="10"
right="-10">
<layout_panel
follows="top|left|right"
height="60"
layout="topleft"
left="0"
name="local_image_size_lp"
auto_resize="false"
top="0"
right="-1"
visible="true">
<spinner
allow_text_entry="false"
decimal_digits="0"
follows="left|top"
height="20"
increment="32"
label="Width"
label_width="40"
layout="topleft"
left="10"
max_val="6016"
min_val="32"
name="local_snapshot_width"
top_pad="10"
width="95" />
<spinner
allow_text_entry="false"
decimal_digits="0"
follows="left|top"
height="20"
increment="32"
label="Height"
label_width="40"
layout="topleft"
left_pad="5"
max_val="6016"
min_val="32"
name="local_snapshot_height"
top_delta="0"
width="95" />
<check_box
bottom_delta="20"
height="10"
follows="left|top"
label="Constrain proportions"
layout="topleft"
left="10"
name="local_keep_aspect_check" />
</layout_panel>
<layout_panel
follows="top|left|right"
height="23"
layout="topleft"
left="0"
name="local_image_format_quality_lp"
auto_resize="true"
top="0"
right="-1"
visible="true">
<combo_box
follows="left|top"
height="23"
label="Format"
layout="topleft"
left_delta="0"
name="local_format_combo"
top_pad="0"
width="120">
<combo_box.item
label="PNG (Lossless)"
name="PNG"
value="PNG" />
<combo_box.item
label="JPEG"
name="JPEG"
value="JPEG" />
<combo_box.item
label="BMP (Lossless)"
name="BMP"
value="BMP" />
</combo_box>
<slider
decimal_digits="0"
follows="left|top"
height="15"
increment="1"
initial_value="75"
label="Image quality"
label_width="80"
layout="topleft"
left="10"
max_val="100"
name="image_quality_slider"
top_pad="7"
width="200" />
<text
type="string"
follows="left|top"
font="SansSerifSmall"
length="1"
height="14"
layout="topleft"
left_pad="-5"
halign="left"
name="image_quality_level"
top_delta="0"
width="60">
([QLVL])
</text>
</layout_panel>
</layout_stack>
<spinner
allow_text_entry="false"
decimal_digits="0"
follows="left|top"
height="20"
increment="32"
label="Width x Height"
label_width="90"
layout="topleft"
left="10"
max_val="6016"
min_val="32"
name="local_snapshot_width"
top_pad="7"
width="144" />
<spinner
allow_text_entry="false"
decimal_digits="0"
follows="left|top"
height="20"
increment="32"
label=""
label_width="0"
layout="topleft"
left_pad="0"
max_val="6016"
min_val="32"
name="local_snapshot_height"
top_delta="0"
width="54" />
<check_box
top_pad="12"
follows="left|top"
label="Constrain proportions"
layout="topleft"
left="10"
name="local_keep_aspect_check" />
<text
type="string"
length="1"
follows="left|top"
height="13"
layout="topleft"
left="10"
name="local_format_label"
top_pad="7"
width="50">
Format:
</text>
<combo_box
follows="left|top|right"
height="20"
label="Format"
layout="topleft"
left="65"
right="-5"
name="local_format_combo"
top_delta="-3"
width="120">
<combo_box.item
label="PNG (Lossless)"
name="PNG"
value="PNG" />
<combo_box.item
label="JPEG"
name="JPEG"
value="JPEG" />
<combo_box.item
label="BMP (Lossless)"
name="BMP"
value="BMP" />
</combo_box>
<slider
decimal_digits="0"
follows="left|top"
height="15"
increment="1"
initial_value="75"
label="Quality:"
label_width="45"
layout="topleft"
left="10"
max_val="100"
name="image_quality_slider"
top_pad="6"
width="203" />
<button
follows="right|bottom"
height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
right="-32"
top="350"
width="100">
right="-5"
top="337"
width="97">
<button.commit_callback
function="Local.Cancel" />
</button>
<flyout_button
follows="right|bottom"
follows="left|bottom"
height="23"
label="Save"
layout="topleft"
left_delta="-106"
left="10"
name="save_btn"
tool_tip="Save image to a file"
top_delta="0"
width="100">
width="97">
<flyout_button.item
label="Save"
name="save_item"
@ -232,4 +196,4 @@
name="saveas_item"
value="save as" />
</flyout_button>
</panel>
</panel>

View File

@ -4,117 +4,124 @@
height="240"
layout="topleft"
name="panel_snapshot_options"
width="490">
<button
follows="left|top|right"
width="208">
<button
follows="left|top"
font="SansSerif"
halign="left"
height="38"
image_overlay="Snapshot_Profile"
height="22"
image_overlay="Snapshot_Download"
image_overlay_alignment="left"
image_top_pad="-2"
image_top_pad="-0"
imgoverlay_label_space="10"
label="Post to My Profile Feed"
label="Save to Disk"
layout="topleft"
left_delta="0"
name="save_to_profile_btn"
pad_left="10"
right="-10"
top_pad="10">
left="9"
name="save_to_computer_btn"
top_pad="9">
<button.commit_callback
function="Snapshot.SaveToProfile" />
function="Snapshot.SaveToComputer" />
</button>
<button
follows="left|top|right"
follows="left|top"
font="SansSerif"
halign="left"
height="38"
image_overlay="Snapshot_Email"
image_overlay_alignment="left"
image_top_pad="-2"
imgoverlay_label_space="10"
label="Email"
layout="topleft"
left_delta="0"
name="save_to_email_btn"
pad_left="10"
right="-10"
top_pad="10">
<button.commit_callback
function="Snapshot.SaveToEmail" />
</button>
<button
follows="left|top|right"
font="SansSerif"
halign="left"
height="38"
height="22"
image_overlay="Snapshot_Inventory"
image_overlay_alignment="left"
image_top_pad="-2"
image_top_pad="-1"
imgoverlay_label_space="10"
label="Save to My Inventory (L$[AMOUNT])"
label="Save to Inventory (L$[AMOUNT])"
layout="topleft"
left_delta="0"
name="save_to_inventory_btn"
pad_left="10"
right="-10"
top_pad="10">
top_pad="5">
<button.commit_callback
function="Snapshot.SaveToInventory" />
</button>
<button
follows="left|top|right"
follows="left|top"
font="SansSerif"
halign="left"
height="38"
image_overlay="Snapshot_Download"
height="22"
image_overlay="Snapshot_Profile"
image_overlay_alignment="left"
image_top_pad="-2"
image_top_pad="-1"
imgoverlay_label_space="10"
label="Save to My Computer"
label="Upload to Profile"
layout="topleft"
name="save_to_profile_btn"
left_delta="0"
top_pad="5">
<button.commit_callback
function="Snapshot.SaveToProfile" />
</button>
<button
follows="left|top"
font="SansSerif"
halign="left"
height="22"
image_overlay="Snapshot_Facebook"
image_overlay_alignment="left"
image_top_pad="0"
imgoverlay_label_space="10"
label="Upload to Facebook"
layout="topleft"
left_delta="0"
name="save_to_computer_btn"
pad_left="10"
right="-10"
top_pad="10">
name="send_to_facebook_btn"
top_pad="5">
<button.commit_callback
function="Snapshot.SaveToComputer" />
function="Snapshot.SendToFacebook"/>
</button>
<text
font="SansSerif"
layout="topleft"
length="1"
follows="top|left"
height="16"
left="10"
name="send_to_facebook_textbox"
top_pad="10"
type="string">
Send to: [secondlife:/// Facebook]
</text>
<text
font="SansSerif"
layout="topleft"
length="1"
follows="top|left"
height="16"
left="140"
name="send_to_twitter_textbox"
top_pad="-16"
type="string">
[secondlife:/// Twitter]
</text>
<text
font="SansSerif"
layout="topleft"
length="1"
follows="top|left"
height="16"
left="190"
name="send_to_flickr_textbox"
top_pad="-16"
type="string">
[secondlife:/// Flickr]
</text>
</panel>
<button
follows="left|top"
font="SansSerif"
halign="left"
height="22"
image_overlay="Command_Twitter_Icon"
image_overlay_alignment="left"
image_top_pad="0"
imgoverlay_label_space="10"
label="Upload to Twitter"
layout="topleft"
left_delta="0"
name="send_to_twitter_btn"
top_pad="5">
<button.commit_callback
function="Snapshot.SendToTwitter"/>
</button>
<button
follows="left|top"
font="SansSerif"
halign="left"
height="22"
image_overlay="Command_Flickr_Icon"
image_overlay_alignment="left"
image_top_pad="0"
imgoverlay_label_space="10"
label="Upload to Flickr"
layout="topleft"
left_delta="0"
name="send_to_flickr_btn"
top_pad="5">
<button.commit_callback
function="Snapshot.SendToFlickr"/>
</button>
<button
follows="left|top"
font="SansSerif"
halign="left"
height="22"
image_overlay="Snapshot_Email"
image_overlay_alignment="left"
image_top_pad="0"
imgoverlay_label_space="10"
label="Send via E-mail"
layout="topleft"
left_delta="0"
name="save_to_email_btn"
top_pad="5">
<button.commit_callback
function="Snapshot.SaveToEmail" />
</button>
</panel>

View File

@ -24,12 +24,12 @@
left="12"
mouse_opaque="true"
name="title_icon"
top="5"
top="7"
width="18" />
<text
follows="top|left|right"
font="SansSerifBold"
height="20"
height="14"
layout="topleft"
left_pad="12"
length="1"
@ -37,63 +37,67 @@
right="-10"
text_color="white"
type="string"
top_delta="3">
Email
top_delta="2">
E-mail
</text>
<button
follows="right|top"
height="23"
is_toggle="true"
label="Message"
layout="topleft"
name="message_btn"
right="-82"
top_delta="-7"
width="70">
<button.commit_callback
function="Postcard.Message" />
</button>
<button
follows="right|top"
height="23"
is_toggle="true"
label="Settings"
layout="topleft"
name="settings_btn"
top_delta="0"
right="-10"
width="70">
<button.commit_callback
function="Postcard.Settings" />
</button>
<view_border
bevel_style="in"
follows="left|top|right"
height="1"
left="10"
left="9"
layout="topleft"
name="hr"
right="-10"
right="-5"
top_pad="5"
/>
<panel_container
<tab_container
name="postcard_tabs"
tab_group="1"
tab_min_width="97"
tab_height="21"
tab_position="top"
top_pad="7"
left="5"
right="-2"
height="319"
follows="all"
height="340"
layout="topleft"
left="0"
name="postcard_panel_container"
default_panel_name="panel_postcard_message"
top_pad="10"
width="490">
halign="center"
use_highlighting_on_hover="true">
<panel
follows="all"
layout="topleft"
label="Message"
name="panel_postcard_message"
filename="panel_postcard_message.xml" />
<panel
follows="all"
layout="topleft"
label="Settings"
name="panel_postcard_settings"
filename="panel_postcard_settings.xml" />
</panel_container>
</panel>
</tab_container>
<button
follows="right|bottom"
height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
right="-6"
bottom="-20"
width="97">
<button.commit_callback
function="Postcard.Cancel" />
</button>
<button
follows="left|bottom"
height="23"
label="Send"
layout="topleft"
left="10"
name="send_btn"
top_delta="0"
width="97">
<button.commit_callback
function="Postcard.Send" />
</button>
</panel>

View File

@ -12,12 +12,12 @@
left="12"
mouse_opaque="true"
name="title_icon"
top="5"
top="7"
width="18" />
<text
follows="top|left|right"
font="SansSerifBold"
height="20"
height="14"
layout="topleft"
left_pad="12"
length="1"
@ -26,27 +26,28 @@
text_color="white"
type="string"
top_delta="4">
Post to My Profile Feed
Profile
</text>
<view_border
bevel_style="in"
follows="left|top|right"
height="1"
left="10"
left="9"
layout="topleft"
name="hr"
right="-10"
right="-5"
top_pad="5"
/>
<combo_box
follows="left|top"
follows="left|top|right"
height="23"
label="Resolution"
layout="topleft"
left_delta="0"
left="10"
right="-5"
name="profile_size_combo"
top_pad="10"
width="250">
top_pad="5"
width="180">
<combo_box.item
label="Current Window"
name="CurrentWindow"
@ -68,132 +69,99 @@
name="Custom"
value="[i-1,i-1]" />
</combo_box>
<layout_stack
animate="false"
follows="all"
height="270"
layout="bottomleft"
name="profile_image_params_ls"
<spinner
allow_text_entry="false"
decimal_digits="0"
follows="left|top"
height="20"
increment="32"
label="Width x Height"
label_width="90"
layout="topleft"
left="10"
max_val="6016"
min_val="32"
name="profile_snapshot_width"
top_pad="7"
width="144" />
<spinner
allow_text_entry="false"
decimal_digits="0"
follows="left|top"
height="20"
increment="32"
label=""
label_width="0"
layout="topleft"
left_pad="0"
max_val="6016"
min_val="32"
name="profile_snapshot_height"
top_delta="0"
width="54" />
<check_box
top_pad="12"
label="Constrain proportions"
layout="topleft"
left="10"
name="profile_keep_aspect_check" />
<text
length="1"
follows="top|left|right"
height="16"
layout="topleft"
left="12"
name="caption_label"
right="-10"
top_pad="4"
type="string">
Caption:
</text>
<text_editor
follows="top|left|right"
height="35"
layout="topleft"
left="10"
right="-5"
length="1"
max_length="700"
name="caption"
width="200"
top_pad="2"
type="string"
word_wrap="true">
</text_editor>
<check_box
follows="left|top"
initial_value="true"
label="Include location"
layout="topleft"
left_delta="0"
orientation="vertical"
top_pad="10"
right="-10">
<layout_panel
follows="top|left|right"
height="55"
layout="topleft"
left="0"
name="profile_image_size_lp"
auto_resize="false"
top="0"
right="-1"
visible="true">
<spinner
allow_text_entry="false"
decimal_digits="0"
follows="left|top"
height="20"
increment="32"
label="Width"
label_width="40"
layout="topleft"
left="10"
max_val="6016"
min_val="32"
name="profile_snapshot_width"
top_pad="10"
width="95" />
<spinner
allow_text_entry="false"
decimal_digits="0"
follows="left|top"
height="20"
increment="32"
label="Height"
label_width="40"
layout="topleft"
left_pad="5"
max_val="6016"
min_val="32"
name="profile_snapshot_height"
top_delta="0"
width="95" />
<check_box
height="10"
bottom_delta="20"
label="Constrain proportions"
layout="topleft"
left="10"
name="profile_keep_aspect_check" />
</layout_panel>
<layout_panel
follows="top|left|right"
height="200"
layout="topleft"
left="0"
name="profile_image_metadata_lp"
auto_resize="true"
top="0"
right="-1"
visible="true">
<text
length="1"
follows="top|left|right"
font="SansSerif"
height="16"
layout="topleft"
left="0"
name="caption_label"
right="-10"
top_pad="0"
type="string">
Caption:
</text>
<text_editor
follows="all"
height="155"
layout="topleft"
left_delta="0"
length="1"
max_length="700"
name="caption"
right="-10"
top_pad="5"
type="string"
word_wrap="true">
</text_editor>
<check_box
follows="left|bottom"
initial_value="true"
label="Include location"
layout="topleft"
left_delta="0"
name="add_location_cb"
top_pad="15" />
</layout_panel>
</layout_stack>
height="18"
name="add_location_cb"
top_pad="3" />
<button
follows="right|bottom"
height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
right="-32"
top="350"
width="100">
right="-5"
top="337"
width="97">
<button.commit_callback
function="PostToProfile.Cancel" />
</button>
<button
follows="right|bottom"
follows="left|bottom"
height="23"
label="Post"
layout="topleft"
left_delta="-106"
left="10"
name="post_btn"
top_delta="0"
width="100">
width="97">
<button.commit_callback
function="PostToProfile.Send" />
</button>
</panel>
</panel>

View File

@ -36,8 +36,9 @@
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="45"
height="22"
label=""
label_height="0"
layout="topleft"
left="10"
name="colorswatch"

View File

@ -1,6 +1,6 @@
<panel
height="400"
width="304"
width="272"
layout="topleft"
name="panel_twitter_account">
<string
@ -15,9 +15,9 @@
follows="top|left"
font="SansSerif"
height="16"
left="9"
left="10"
name="account_caption_label"
top="21"
top="5"
type="string">
Not connected to Twitter.
</text>
@ -28,19 +28,23 @@
follows="top|left"
font="SansSerif"
height="16"
left="9"
left="10"
name="account_name_label"
parse_urls="true"
type="string"/>
<panel
layout="topleft"
follows="top|left"
name="panel_buttons"
height="345"
left="9">
top_pad="3"
left="0">
<button
layout="topleft"
follows="left|top"
follows="left|top|right"
top_pad="9"
left="10"
right="-10"
visible="true"
height="23"
label="Connect..."
@ -51,8 +55,10 @@
<button
layout="topleft"
follows="left|top"
follows="left|top|right"
top_delta="0"
left="10"
right="-10"
height="23"
label="Disconnect"
name="disconnect_btn"
@ -65,9 +71,9 @@
length="1"
follows="top|left"
height="16"
left="0"
left="10"
name="account_learn_more_label"
top_pad="20"
top_pad="5"
type="string">
[http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Twitter/ta-p/2435453 Learn about posting to Twitter]
</text>

View File

@ -3,31 +3,22 @@
width="304"
layout="topleft"
name="panel_twitter_photo">
<layout_stack
layout="topleft"
border_size="0"
height="412"
follows="all"
orientation="vertical"
name="stack_photo"
top="8">
<layout_panel
name="text_panel"
height="160">
<text
length="1"
layout="topleft"
follows="top|left|right"
font="SansSerif"
height="16"
left="9"
left="10"
name="status_label"
top="3"
top="5"
type="string">
What's happening?
</text>
<text
length="1"
follows="top|left"
layout="topleft"
font="SansSerif"
text_color="EmphasisColor"
halign="right"
@ -35,15 +26,16 @@
width="30"
left="227"
name="status_counter_label"
top="3"
top="5"
type="string">
140
</text>
<text_editor
follows="left|top"
layout="topleft"
height="87"
width="250"
left="9"
left="10"
length="1"
max_length="140"
name="photo_status"
@ -52,33 +44,32 @@
</text_editor>
<check_box
follows="left|top"
layout="topleft"
initial_value="true"
label="Include SL location"
name="add_location_cb"
left="9"
left="10"
height="16"
top_pad="10"/>
top_pad="8"/>
<check_box
follows="left|top"
layout="topleft"
initial_value="true"
label="Include a photo"
name="add_photo_cb"
left="9"
left="10"
height="16"
top_pad="10"/>
</layout_panel>
<layout_panel
name="snapshot_panel"
height="227">
top_pad="1"/>
<combo_box
control_name="TwitterPhotoResolution"
follows="left|top"
top="6"
left="9"
layout="topleft"
top_pad="5"
left="10"
name="resolution_combobox"
tool_tip="Image resolution"
height="21"
width="135">
width="124">
<combo_box.item
label="Current Window"
name="CurrentWindow"
@ -99,31 +90,61 @@
<combo_box
control_name="TwitterPhotoFilters"
follows="right|top"
layout="topleft"
name="filters_combobox"
tool_tip="Image filters"
top="6"
left="165"
top_delta="0"
right="-10"
height="21"
width="135">
width="124">
<combo_box.item
label="No Filter"
name="NoFilter"
value="NoFilter" />
</combo_box>
<panel
layout="topleft"
height="150"
width="250"
visible="true"
name="thumbnail_placeholder"
top="33"
follows="left|top"
left="9">
top_pad="5"
right="-10"
follows="left|top|right"
left="10">
</panel>
<text
follows="left|top"
layout="topleft"
font="SansSerif"
text_color="EmphasisColor"
height="14"
top_pad="2"
left="10"
length="1"
halign="center"
name="working_lbl"
translate="false"
type="string"
visible="true"
width="251">
Refreshing...
</text>
<view_border
bevel_style="in"
follows="left|top"
layout="topleft"
height="1"
left="10"
name="refresh_border"
width="250"
top_pad="0"/>
<button
follows="left|top"
layout="topleft"
height="23"
label="Refresh"
left="9"
left="10"
top_pad="5"
name="new_snapshot_btn"
tool_tip="Click to refresh"
@ -132,28 +153,13 @@
<button.commit_callback
function="SocialSharing.RefreshPhoto" />
</button>
<text
follows="left|top"
font="SansSerif"
text_color="EmphasisColor"
height="14"
top_pad="-19"
left_pad="-30"
length="1"
halign="center"
name="working_lbl"
translate="false"
type="string"
visible="true"
width="150">
Refreshing...
</text>
<button
follows="right|top"
layout="topleft"
height="23"
label="Preview"
left="200"
top_pad="-19"
right="-10"
top_delta="0"
name="big_preview_btn"
tool_tip="Click to toggle preview"
is_toggle="true"
@ -162,14 +168,11 @@
<button.commit_callback
function="SocialSharing.BigPreview" />
</button>
</layout_panel>
<layout_panel
name="photo_button_panel"
height="25">
<button
follows="left|top"
top="0"
left="9"
layout="topleft"
top_pad="3"
left="10"
height="23"
label="Tweet"
name="post_photo_btn"
@ -178,16 +181,15 @@
function="SocialSharing.SendPhoto" />
</button>
<button
follows="left|top"
follows="right|top"
layout="topleft"
height="23"
label="Cancel"
name="cancel_photo_btn"
left_pad="15"
right="-10"
top_delta="0"
width="100">
<button.commit_callback
function="SocialSharing.Cancel" />
</button>
</layout_panel>
</layout_stack>
</panel>

View File

@ -48,7 +48,10 @@ Go to &apos;Welcome Island Public&apos; to repeat the tutorial.
<message name="MustGetAgeRegion">
You must be age 18 or over to enter this region.
</message>
</message_set>
<message name="RegionTPSpecialUsageBlocked">
Unable to enter region. '[REGION_NAME]' is a Skill Gaming Region, and you must meet certain criteria in order to enter. For details, please review the [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ].
</message>
</message_set>
<message_set name="progress">
<message name="sending_dest">
Sending to destination.

View File

@ -1,45 +0,0 @@
# -*- cmake -*-
project(win_updater)
include(00-Common)
include(LLCommon)
include(Linking)
# *HACK - override msvcrt implementation (intialized on 00-Common) to be
# statically linked for the installer this relies on vc taking the last flag on
# the command line
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
include_directories(
${LLCOMMON_INCLUDE_DIRS}
)
set(win_updater_SOURCE_FILES updater.cpp)
set(win_updater_HEADER_FILES CMakeLists.txt)
set_source_files_properties(${win_updater_HEADER_FILES}
PROPERTIES HEADER_FILE_ONLY TRUE)
list(APPEND win_updater_SOURCE_FILES ${win_updater_HEADER_FILES})
add_executable(windows-updater WIN32 ${win_updater_SOURCE_FILES})
target_link_libraries(windows-updater
wininet
user32
gdi32
shell32
)
set_target_properties(windows-updater
PROPERTIES
LINK_FLAGS "/NODEFAULTLIB:MSVCRT"
LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;MSVCRT\""
)
# The windows-updater doesn't link against anything non-system, apparently
#ll_deploy_sharedlibs_command(windows-updater)

View File

@ -1,516 +0,0 @@
/**
* @file updater.cpp
* @brief Windows auto-updater
*
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* 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.
*
* 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
//
// Usage: updater -url <url>
//
// We use dangerous fopen, strtok, mbstowcs, sprintf
// which generates warnings on VC2005.
// *TODO: Switch to fopen_s, strtok_s, etc.
#define _CRT_SECURE_NO_DEPRECATE
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <string>
#include <iostream>
#include <stdexcept>
#include <sstream>
#include <fstream>
#define BUFSIZE 8192
int gTotalBytesRead = 0;
DWORD gTotalBytes = -1;
HWND gWindow = NULL;
WCHAR gProgress[256];
char* gUpdateURL = NULL;
#if _DEBUG
std::ofstream logfile;
#define DEBUG(expr) logfile << expr << std::endl
#else
#define DEBUG(expr) /**/
#endif
char* wchars_to_utf8chars(const WCHAR* in_chars)
{
int tlen = 0;
const WCHAR* twc = in_chars;
while (*twc++ != 0)
{
tlen++;
}
char* outchars = new char[tlen];
char* res = outchars;
for (int i=0; i<tlen; i++)
{
int cur_char = (int)(*in_chars++);
if (cur_char < 0x80)
{
*outchars++ = (char)cur_char;
}
else
{
*outchars++ = '?';
}
}
*outchars = 0;
return res;
}
class Fetcher
{
public:
Fetcher(const std::wstring& uri)
{
// These actions are broken out as separate methods not because it
// makes the code clearer, but to avoid triggering AntiVir and
// McAfee-GW-Edition virus scanners (DEV-31680).
mInet = openInet();
mDownload = openUrl(uri);
}
~Fetcher()
{
DEBUG("Calling InternetCloseHandle");
InternetCloseHandle(mDownload);
InternetCloseHandle(mInet);
}
unsigned long read(char* buffer, size_t bufflen) const;
DWORD getTotalBytes() const
{
DWORD totalBytes;
DWORD sizeof_total_bytes = sizeof(totalBytes);
HttpQueryInfo(mDownload, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
&totalBytes, &sizeof_total_bytes, NULL);
return totalBytes;
}
struct InetError: public std::runtime_error
{
InetError(const std::string& what): std::runtime_error(what) {}
};
private:
// We test results from a number of different MS functions with different
// return types -- but the common characteristic is that 0 (i.e. (! result))
// means an error of some kind.
template <typename RESULT>
static RESULT check(const std::string& desc, RESULT result)
{
if (result)
{
// success, show caller
return result;
}
DWORD err = GetLastError();
std::ostringstream out;
out << desc << " Failed: " << err;
DEBUG(out.str());
throw InetError(out.str());
}
HINTERNET openUrl(const std::wstring& uri) const;
HINTERNET openInet() const;
HINTERNET mInet, mDownload;
};
HINTERNET Fetcher::openInet() const
{
DEBUG("Calling InternetOpen");
// Init wininet subsystem
return check("InternetOpen",
InternetOpen(L"LindenUpdater", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0));
}
HINTERNET Fetcher::openUrl(const std::wstring& uri) const
{
DEBUG("Calling InternetOpenUrl: " << wchars_to_utf8chars(uri.c_str()));
return check("InternetOpenUrl",
InternetOpenUrl(mInet, uri.c_str(), NULL, 0, INTERNET_FLAG_NEED_FILE, NULL));
}
unsigned long Fetcher::read(char* buffer, size_t bufflen) const
{
unsigned long bytes_read = 0;
DEBUG("Calling InternetReadFile");
check("InternetReadFile",
InternetReadFile(mDownload, buffer, bufflen, &bytes_read));
return bytes_read;
}
int WINAPI get_url_into_file(const std::wstring& uri, const std::string& path, int *cancelled)
{
int success = FALSE;
*cancelled = FALSE;
DEBUG("Opening '" << path << "'");
FILE* fp = fopen(path.c_str(), "wb"); /* Flawfinder: ignore */
if (!fp)
{
DEBUG("Failed to open '" << path << "'");
return success;
}
// Note, ctor can throw, since it uses check() function.
Fetcher fetcher(uri);
gTotalBytes = fetcher.getTotalBytes();
/*==========================================================================*|
// nobody uses total_bytes?!? What's this doing here?
DWORD total_bytes = 0;
success = check("InternetQueryDataAvailable",
InternetQueryDataAvailable(hdownload, &total_bytes, 0, 0));
|*==========================================================================*/
success = FALSE;
while(!success && !(*cancelled))
{
char data[BUFSIZE]; /* Flawfinder: ignore */
unsigned long bytes_read = fetcher.read(data, sizeof(data));
if (!bytes_read)
{
DEBUG("InternetReadFile Read " << bytes_read << " bytes.");
}
DEBUG("Reading Data, bytes_read = " << bytes_read);
if (bytes_read == 0)
{
// If InternetFileRead returns TRUE AND bytes_read == 0
// we've successfully downloaded the entire file
wsprintf(gProgress, L"Download complete.");
success = TRUE;
}
else
{
// write what we've got, then continue
fwrite(data, sizeof(char), bytes_read, fp);
gTotalBytesRead += int(bytes_read);
if (gTotalBytes != -1)
wsprintf(gProgress, L"Downloaded: %d%%", 100 * gTotalBytesRead / gTotalBytes);
else
wsprintf(gProgress, L"Downloaded: %dK", gTotalBytesRead / 1024);
}
DEBUG("Calling InvalidateRect");
// Mark the window as needing redraw (of the whole thing)
InvalidateRect(gWindow, NULL, TRUE);
// Do the redraw
DEBUG("Calling UpdateWindow");
UpdateWindow(gWindow);
DEBUG("Calling PeekMessage");
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if (msg.message == WM_QUIT)
{
// bail out, user cancelled
*cancelled = TRUE;
}
}
}
fclose(fp);
return success;
}
LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
HDC hdc; // Drawing context
PAINTSTRUCT ps;
switch(message)
{
case WM_PAINT:
{
hdc = BeginPaint(hwnd, &ps);
RECT rect;
GetClientRect(hwnd, &rect);
DrawText(hdc, gProgress, -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);
return 0;
}
case WM_CLOSE:
case WM_DESTROY:
// Get out of full screen
// full_screen_mode(false);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wparam, lparam);
}
#define win_class_name L"FullScreen"
int parse_args(int argc, char **argv)
{
int j;
for (j = 1; j < argc; j++)
{
if ((!strcmp(argv[j], "-url")) && (++j < argc))
{
gUpdateURL = argv[j];
}
}
// If nothing was set, let the caller know.
if (!gUpdateURL)
{
return 1;
}
return 0;
}
int WINAPI
WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
// Parse the command line.
LPSTR cmd_line_including_exe_name = GetCommandLineA();
const int MAX_ARGS = 100;
int argc = 0;
char* argv[MAX_ARGS]; /* Flawfinder: ignore */
#if _DEBUG
logfile.open("updater.log", std::ios_base::out);
DEBUG("Parsing command arguments");
#endif
char *token = NULL;
if( cmd_line_including_exe_name[0] == '\"' )
{
// Exe name is enclosed in quotes
token = strtok( cmd_line_including_exe_name, "\"" );
argv[argc++] = token;
token = strtok( NULL, " \t," );
}
else
{
// Exe name is not enclosed in quotes
token = strtok( cmd_line_including_exe_name, " \t," );
}
while( (token != NULL) && (argc < MAX_ARGS) )
{
argv[argc++] = token;
/* Get next token: */
if (*(token + strlen(token) + 1) == '\"') /* Flawfinder: ignore */
{
token = strtok( NULL, "\"");
}
else
{
token = strtok( NULL, " \t," );
}
}
gUpdateURL = NULL;
/////////////////////////////////////////
//
// Process command line arguments
//
DEBUG("Processing command arguments");
//
// Parse the command line arguments
//
int parse_args_result = parse_args(argc, argv);
WNDCLASSEX wndclassex = { 0 };
//DEVMODE dev_mode = { 0 };
const int WINDOW_WIDTH = 250;
const int WINDOW_HEIGHT = 100;
wsprintf(gProgress, L"Connecting...");
/* Init the WNDCLASSEX */
wndclassex.cbSize = sizeof(WNDCLASSEX);
wndclassex.style = CS_HREDRAW | CS_VREDRAW;
wndclassex.hInstance = hInstance;
wndclassex.lpfnWndProc = WinProc;
wndclassex.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclassex.lpszClassName = win_class_name;
RegisterClassEx(&wndclassex);
// Get the size of the screen
//EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode);
gWindow = CreateWindowEx(NULL, win_class_name,
L"Second Life Updater",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
WINDOW_WIDTH,
WINDOW_HEIGHT,
NULL, NULL, hInstance, NULL);
ShowWindow(gWindow, nShowCmd);
UpdateWindow(gWindow);
if (parse_args_result)
{
MessageBox(gWindow,
L"Usage: updater -url <url> [-name <window_title>] [-program <program_name>] [-silent]",
L"Usage", MB_OK);
return parse_args_result;
}
// Did we get a userserver to work with?
if (!gUpdateURL)
{
MessageBox(gWindow, L"Please specify the download url from the command line",
L"Error", MB_OK);
return 1;
}
// Can't feed GetTempPath into GetTempFile directly
char temp_path[MAX_PATH]; /* Flawfinder: ignore */
if (0 == GetTempPathA(sizeof(temp_path), temp_path))
{
MessageBox(gWindow, L"Problem with GetTempPath()",
L"Error", MB_OK);
return 1;
}
std::string update_exec_path(temp_path);
update_exec_path.append("Second_Life_Updater.exe");
WCHAR update_uri[4096];
mbstowcs(update_uri, gUpdateURL, sizeof(update_uri));
int success = 0;
int cancelled = 0;
// Actually do the download
try
{
DEBUG("Calling get_url_into_file");
success = get_url_into_file(update_uri, update_exec_path, &cancelled);
}
catch (const Fetcher::InetError& e)
{
(void)e;
success = FALSE;
DEBUG("Caught: " << e.what());
}
// WinInet can't tell us if we got a 404 or not. Therefor, we check
// for the size of the downloaded file, and assume that our installer
// will always be greater than 1MB.
if (gTotalBytesRead < (1024 * 1024) && ! cancelled)
{
MessageBox(gWindow,
L"The Second Life auto-update has failed.\n"
L"The problem may be caused by other software installed \n"
L"on your computer, such as a firewall.\n"
L"Please visit http://secondlife.com/download/ \n"
L"to download the latest version of Second Life.\n",
NULL, MB_OK);
return 1;
}
if (cancelled)
{
// silently exit
return 0;
}
if (!success)
{
MessageBox(gWindow,
L"Second Life download failed.\n"
L"Please try again later.",
NULL, MB_OK);
return 1;
}
// TODO: Make updates silent (with /S to NSIS)
//char params[256]; /* Flawfinder: ignore */
//sprintf(params, "/S"); /* Flawfinder: ignore */
//MessageBox(gWindow,
// L"Updating Second Life.\n\nSecond Life will automatically start once the update is complete. This may take a minute...",
// L"Download Complete",
// MB_OK);
/*==========================================================================*|
// DEV-31680: ShellExecuteA() causes McAfee-GW-Edition and AntiVir
// scanners to flag this executable as a probable virus vector.
// Less than or equal to 32 means failure
if (32 >= (int) ShellExecuteA(gWindow, "open", update_exec_path.c_str(), NULL,
"C:\\", SW_SHOWDEFAULT))
|*==========================================================================*/
// from http://msdn.microsoft.com/en-us/library/ms682512(VS.85).aspx
STARTUPINFOA si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (! CreateProcessA(update_exec_path.c_str(), // executable file
NULL, // command line
NULL, // process cannot be inherited
NULL, // thread cannot be inherited
FALSE, // do not inherit existing handles
0, // process creation flags
NULL, // inherit parent's environment
NULL, // inherit parent's current dir
&si, // STARTUPINFO
&pi)) // PROCESS_INFORMATION
{
MessageBox(gWindow, L"Update failed. Please try again later.", NULL, MB_OK);
return 1;
}
// Give installer some time to open a window
Sleep(1000);
return 0;
}