Merge LL V3.7.15
commit
4dc6285816
1
.hgtags
1
.hgtags
|
|
@ -517,3 +517,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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -1361,6 +1398,7 @@ Whirly Fizzle
|
|||
VWR-29543
|
||||
MAINT-873
|
||||
STORM-1930
|
||||
BUG-6659
|
||||
Whoops Babii
|
||||
VWR-631
|
||||
VWR-1640
|
||||
|
|
|
|||
|
|
@ -105,7 +105,6 @@ add_subdirectory(${LIBS_OPEN_PREFIX}teapot)
|
|||
|
||||
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})
|
||||
|
|
@ -120,9 +119,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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -1,933 +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())
|
||||
{
|
||||
#if ( !defined(GLIB_MAJOR_VERSION) && !defined(GLIB_MINOR_VERSION) ) || ( GLIB_MAJOR_VERSION < 2 ) || ( GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 32 )
|
||||
g_thread_init(NULL);
|
||||
#endif
|
||||
|
||||
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
|
||||
#if ( !defined(GLIB_MAJOR_VERSION) && !defined(GLIB_MINOR_VERSION) ) || ( GLIB_MAJOR_VERSION < 2 ) || ( GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 32 )
|
||||
g_thread_create(GThreadFunc(worker_thread_cb), app_state, FALSE, NULL);
|
||||
#else
|
||||
g_thread_new( "download", GThreadFunc(worker_thread_cb), app_state );
|
||||
#endif
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -2095,7 +2095,6 @@ if (WINDOWS)
|
|||
media_plugin_webkit
|
||||
winmm_shim
|
||||
windows-crash-logger
|
||||
windows-updater
|
||||
)
|
||||
|
||||
if( ND_BUILD64BIT_ARCH )
|
||||
|
|
@ -2160,7 +2159,6 @@ if (WINDOWS)
|
|||
|
||||
add_dependencies(${VIEWER_BINARY_NAME}
|
||||
SLPlugin
|
||||
windows-updater
|
||||
windows-crash-logger
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -1517,7 +1517,7 @@
|
|||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>AgentPause</key>
|
||||
<map>
|
||||
|
|
@ -14071,17 +14071,6 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<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>
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
@ -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///////
|
||||
////////////////////////
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -67,7 +67,6 @@ private:
|
|||
|
||||
LLHandle<LLView> mPreviewHandle;
|
||||
|
||||
LLUICtrl * mSnapshotPanel;
|
||||
LLUICtrl * mResolutionComboBox;
|
||||
LLUICtrl * mFilterComboBox;
|
||||
LLUICtrl * mRefreshBtn;
|
||||
|
|
|
|||
|
|
@ -1598,6 +1598,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"));
|
||||
|
|
@ -1672,6 +1674,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo
|
|||
{
|
||||
msg->getU32("DataExtended", "TimeStamp", most_recent_time, i);
|
||||
}
|
||||
|
||||
if (owner_id.isNull())
|
||||
{
|
||||
continue;
|
||||
|
|
@ -1735,10 +1738,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())
|
||||
{
|
||||
|
|
@ -1748,6 +1751,8 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo
|
|||
{
|
||||
self->mOwnerList->setEnabled(TRUE);
|
||||
}
|
||||
|
||||
self->mBtnRefresh->setEnabled(true);
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
|
|||
|
|
@ -528,6 +528,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
|
||||
|
|
@ -1191,6 +1202,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);
|
||||
}
|
||||
|
||||
|
|
@ -1205,6 +1221,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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -102,6 +102,8 @@ public:
|
|||
|
||||
void requestRegionInfo();
|
||||
void requestMeshRezInfo();
|
||||
void enableTopButtons();
|
||||
void disableTopButtons();
|
||||
|
||||
private:
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@
|
|||
#include "llviewerregion.h"
|
||||
#include "lluictrlfactory.h"
|
||||
#include "llviewerwindow.h"
|
||||
#include "llfloaterregioninfo.h"
|
||||
|
||||
#include "llavataractions.h"
|
||||
|
||||
|
|
@ -221,7 +222,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";
|
||||
|
|
@ -271,6 +272,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
|
||||
{
|
||||
|
|
@ -282,6 +285,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()
|
||||
|
|
@ -485,12 +495,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;
|
||||
|
|
|
|||
|
|
@ -67,6 +67,7 @@ public:
|
|||
void onRefresh();
|
||||
|
||||
static void setMode(U32 mode);
|
||||
void disableRefreshBtn();
|
||||
|
||||
private:
|
||||
LLFloaterTopObjects(const LLSD& key);
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -70,7 +70,6 @@ private:
|
|||
|
||||
LLHandle<LLView> mPreviewHandle;
|
||||
|
||||
LLUICtrl * mSnapshotPanel;
|
||||
LLUICtrl * mResolutionComboBox;
|
||||
LLUICtrl * mFilterComboBox;
|
||||
LLUICtrl * mRefreshBtn;
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
#include "llfolderview.h"
|
||||
#include "llinventorybridge.h"
|
||||
#include "llviewerfoldertype.h"
|
||||
#include "llradiogroup.h"
|
||||
|
||||
// linden library includes
|
||||
#include "llclipboard.h"
|
||||
|
|
@ -55,6 +56,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),
|
||||
|
|
@ -310,6 +312,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;
|
||||
|
|
@ -318,9 +321,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;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -793,11 +806,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();
|
||||
|
|
@ -826,6 +850,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)
|
||||
{
|
||||
// <FS:Zi> Filter Links Menu
|
||||
|
|
@ -1117,6 +1155,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());
|
||||
|
|
@ -1136,6 +1175,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();
|
||||
|
|
@ -1155,6 +1195,7 @@ void LLInventoryFilter::fromParams(const Params& params)
|
|||
//setFilterWearableTypes(params.filter_ops.wearable_types);
|
||||
//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);
|
||||
|
|
@ -1179,6 +1220,10 @@ void LLInventoryFilter::fromParams(const Params& params)
|
|||
{
|
||||
setHoursAgo(params.filter_ops.hours_ago);
|
||||
}
|
||||
if (params.filter_ops.date_search_direction.isProvided())
|
||||
{
|
||||
setDateSearchDirection(params.filter_ops.date_search_direction);
|
||||
}
|
||||
if (params.filter_ops.show_folder_state.isProvided())
|
||||
{
|
||||
setShowFolderState(params.filter_ops.show_folder_state);
|
||||
|
|
|
|||
|
|
@ -56,6 +56,12 @@ public:
|
|||
FILTERTYPE_WORN = 0x1 << 6, // <FS> search by wearable type
|
||||
};
|
||||
|
||||
enum EFilterDateDirection
|
||||
{
|
||||
FILTERDATEDIRECTION_NEWER,
|
||||
FILTERDATEDIRECTION_OLDER
|
||||
};
|
||||
|
||||
enum EFilterLink
|
||||
{
|
||||
FILTERLINK_INCLUDE_LINKS, // show links too
|
||||
|
|
@ -106,7 +112,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;
|
||||
|
||||
|
|
@ -119,6 +126,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)
|
||||
{}
|
||||
|
|
@ -136,6 +144,7 @@ public:
|
|||
time_t mMinDate,
|
||||
mMaxDate;
|
||||
U32 mHoursAgo;
|
||||
U32 mDateSearchDirection;
|
||||
|
||||
EFolderShow mShowFolderState;
|
||||
PermissionMask mPermissions;
|
||||
|
|
@ -197,6 +206,8 @@ public:
|
|||
|
||||
void setHoursAgo(U32 hours);
|
||||
U32 getHoursAgo() const;
|
||||
void setDateSearchDirection(U32 direction);
|
||||
U32 getDateSearchDirection() const;
|
||||
|
||||
void setFilterLinks(U64 filter_link);
|
||||
U64 getFilterLinks() const;
|
||||
|
|
|
|||
|
|
@ -441,6 +441,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);
|
||||
|
|
|
|||
|
|
@ -178,6 +178,7 @@ public:
|
|||
// ## Zi: Extended Inventory Search
|
||||
void setSinceLogoff(BOOL sl);
|
||||
void setHoursAgo(U32 hours);
|
||||
void setDateSearchDirection(U32 direction);
|
||||
BOOL getSinceLogoff();
|
||||
void setFilterLinks(U64 filter_links);
|
||||
U64 getFilterLinks(); // ## Zi: Filter Links Menu
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@
|
|||
#include "llviewertexturelist.h"
|
||||
#include "llsidepanelinventory.h"
|
||||
#include "llfolderview.h"
|
||||
#include "llradiogroup.h"
|
||||
|
||||
// <FS:AW opensim currency support>
|
||||
#include "lltrans.h"
|
||||
|
|
@ -91,6 +92,7 @@ public:
|
|||
void updateElementsFromFilter();
|
||||
BOOL getCheckShowEmpty();
|
||||
BOOL getCheckSinceLogoff();
|
||||
U32 getDateSearchDirection();
|
||||
|
||||
static void onTimeAgo(LLUICtrl*, void *);
|
||||
static void onCloseBtn(void* user_data);
|
||||
|
|
@ -1008,6 +1010,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1027,6 +1053,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());
|
||||
|
|
@ -1048,6 +1075,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()
|
||||
|
|
@ -1148,17 +1176,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();
|
||||
}
|
||||
|
|
@ -1173,6 +1207,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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -57,7 +57,6 @@ public:
|
|||
|
||||
protected:
|
||||
LLSideTrayPanelContainer* getParentContainer();
|
||||
virtual void updateCustomResControls();
|
||||
void updateImageQualityLevel();
|
||||
void goBack(); ///< Switch to the default (Snapshot Options) panel
|
||||
void cancel();
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1357,17 +1357,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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7171,83 +7171,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);
|
||||
}
|
||||
|
||||
|
|
@ -7590,7 +7608,7 @@ void process_alert_core(const std::string& message, BOOL modal)
|
|||
LLFloaterRegionRestarting::close();
|
||||
}
|
||||
|
||||
std::string new_msg =LLNotifications::instance().getGlobalString(text);
|
||||
std::string new_msg =LLNotifications::instance().getGlobalString(text);
|
||||
// [RLVa:KB] - Checked: 2012-02-07 (RLVa-1.4.5) | Added: RLVa-1.4.5
|
||||
if ( (new_msg == text) && (rlv_handler_t::isEnabled()) )
|
||||
{
|
||||
|
|
@ -7600,9 +7618,9 @@ void process_alert_core(const std::string& message, BOOL modal)
|
|||
RlvUtil::filterNames(new_msg);
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
args["MESSAGE"] = new_msg;
|
||||
LLNotificationsUtil::add("SystemMessage", args);
|
||||
}
|
||||
args["MESSAGE"] = new_msg;
|
||||
LLNotificationsUtil::add("SystemMessage", args);
|
||||
}
|
||||
else if (modal)
|
||||
{
|
||||
LLSD args;
|
||||
|
|
@ -8362,8 +8380,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.
|
||||
|
|
@ -8373,16 +8391,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;
|
||||
|
|
@ -8398,7 +8416,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 )
|
||||
{
|
||||
|
|
@ -8411,17 +8429,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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -293,8 +293,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())
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
<check_box label="Temporärer Upload" name="inventory_temp_upload"/>
|
||||
<button label="Abbrechen" name="cancel_btn"/>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -1,8 +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="Auf Flickr hochladen" name="save_to_flickr_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>
|
||||
|
|
|
|||
|
|
@ -9,15 +9,13 @@
|
|||
<string name="upload_message">
|
||||
Senden...
|
||||
</string>
|
||||
<!--
|
||||
<text name="title">
|
||||
E-Mail
|
||||
</text>
|
||||
<button label="Nachricht" name="message_btn"/>
|
||||
<button label="Einstellungen" name="settings_btn"/>
|
||||
-->
|
||||
<tab_container name="postcard_panel_container">
|
||||
<panel label="Nachricht" name="panel_postcard_message"/>
|
||||
<panel label="Einstellungen" name="panel_postcard_settings"/>
|
||||
<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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -2,34 +2,25 @@
|
|||
<floater
|
||||
positioning="cascading"
|
||||
can_close="true"
|
||||
can_resize="true"
|
||||
help_topic="floater_facebook"
|
||||
layout="topleft"
|
||||
name="floater_facebook"
|
||||
save_rect="true"
|
||||
single_instance="true"
|
||||
reuse_instance="true"
|
||||
title="Post to Facebook"
|
||||
min_height="454"
|
||||
title="POST TO FACEBOOK"
|
||||
min_height="462"
|
||||
min_width="304"
|
||||
height="454"
|
||||
width="304">
|
||||
<panel
|
||||
height="454"
|
||||
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="20"
|
||||
tab_min_width="64"
|
||||
tab_height="21"
|
||||
tab_position="top"
|
||||
top="7"
|
||||
height="419"
|
||||
height="437"
|
||||
follows="all"
|
||||
halign="center"
|
||||
use_highlighting_on_hover="true">
|
||||
|
|
@ -37,44 +28,39 @@
|
|||
filename="panel_facebook_status.xml"
|
||||
class="llfacebookstatuspanel"
|
||||
follows="all"
|
||||
label="Status"
|
||||
label="STATUS"
|
||||
name="panel_facebook_status"/>
|
||||
<panel
|
||||
filename="panel_facebook_photo.xml"
|
||||
class="llfacebookphotopanel"
|
||||
follows="all"
|
||||
label="Photo"
|
||||
label="PHOTO"
|
||||
name="panel_facebook_photo"/>
|
||||
<panel
|
||||
filename="panel_facebook_place.xml"
|
||||
class="llfacebookcheckinpanel"
|
||||
follows="all"
|
||||
label="Check In"
|
||||
label="CHECK IN"
|
||||
name="panel_facebook_place"/>
|
||||
<panel
|
||||
filename="panel_facebook_friends.xml"
|
||||
class="llfacebookfriendspanel"
|
||||
follows="all"
|
||||
label="Friends"
|
||||
label="FRIENDS"
|
||||
name="panel_facebook_friends"/>
|
||||
<panel
|
||||
<!--<panel
|
||||
filename="panel_facebook_account.xml"
|
||||
class="llfacebookaccountpanel"
|
||||
follows="all"
|
||||
label="Account"
|
||||
name="panel_facebook_account"/>
|
||||
label="ACCOUNT"
|
||||
name="panel_facebook_account"/>-->
|
||||
</tab_container>
|
||||
<panel
|
||||
name="connection_status_panel"
|
||||
follows="left|bottom|right"
|
||||
bottom="-5"
|
||||
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"
|
||||
|
|
@ -89,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"
|
||||
|
|
@ -107,6 +93,4 @@
|
|||
font="SansSerif">
|
||||
Loading...
|
||||
</text>
|
||||
</panel>
|
||||
</panel>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -9,12 +9,12 @@
|
|||
save_rect="true"
|
||||
single_instance="true"
|
||||
reuse_instance="true"
|
||||
title="Upload to Flickr"
|
||||
height="622"
|
||||
width="304">
|
||||
title="UPLOAD TO FLICKR"
|
||||
height="590"
|
||||
width="272">
|
||||
<panel
|
||||
height="622"
|
||||
width="304"
|
||||
height="590"
|
||||
width="272"
|
||||
visible="true"
|
||||
name="background"
|
||||
follows="all"
|
||||
|
|
@ -24,23 +24,24 @@
|
|||
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
|
||||
filename="panel_flickr_photo.xml"
|
||||
class="llflickrphotopanel"
|
||||
follows="all"
|
||||
label="Photo"
|
||||
label="PHOTO"
|
||||
name="panel_flickr_photo"/>
|
||||
<panel
|
||||
filename="panel_flickr_account.xml"
|
||||
class="llflickraccountpanel"
|
||||
follows="all"
|
||||
label="Account"
|
||||
label="ACCOUNT"
|
||||
name="panel_flickr_account"/>
|
||||
</tab_container>
|
||||
<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"
|
||||
|
|
|
|||
|
|
@ -2,20 +2,20 @@
|
|||
<floater
|
||||
legacy_header_height="18"
|
||||
can_minimize="false"
|
||||
height="410"
|
||||
height="440"
|
||||
layout="topleft"
|
||||
name="Inventory Finder"
|
||||
help_topic="inventory_finder"
|
||||
title="INVENTORY_RECENT_ITEMS"
|
||||
width="154">
|
||||
width="280">
|
||||
<icon
|
||||
height="16"
|
||||
image_name="Inv_Animation"
|
||||
layout="topleft"
|
||||
left="4"
|
||||
left="8"
|
||||
mouse_opaque="true"
|
||||
name="icon_animation"
|
||||
top="24"
|
||||
top="22"
|
||||
width="16" />
|
||||
<check_box
|
||||
height="16"
|
||||
|
|
@ -29,10 +29,10 @@
|
|||
height="16"
|
||||
image_name="Inv_CallingCard"
|
||||
layout="topleft"
|
||||
left="4"
|
||||
left="8"
|
||||
mouse_opaque="true"
|
||||
name="icon_calling_card"
|
||||
top_pad="2"
|
||||
top="42"
|
||||
width="16" />
|
||||
<check_box
|
||||
height="16"
|
||||
|
|
@ -46,10 +46,10 @@
|
|||
height="16"
|
||||
image_name="Inv_Shirt"
|
||||
layout="topleft"
|
||||
left="4"
|
||||
left="8"
|
||||
mouse_opaque="true"
|
||||
name="icon_clothing"
|
||||
top_pad="2"
|
||||
top="62"
|
||||
width="16" />
|
||||
<check_box
|
||||
height="16"
|
||||
|
|
@ -63,10 +63,10 @@
|
|||
height="16"
|
||||
image_name="Inv_Gesture"
|
||||
layout="topleft"
|
||||
left="4"
|
||||
left="8"
|
||||
mouse_opaque="true"
|
||||
name="icon_gesture"
|
||||
top_pad="2"
|
||||
top="82"
|
||||
width="16" />
|
||||
<check_box
|
||||
height="16"
|
||||
|
|
@ -80,10 +80,10 @@
|
|||
height="16"
|
||||
image_name="Inv_Landmark"
|
||||
layout="topleft"
|
||||
left="4"
|
||||
left="8"
|
||||
mouse_opaque="true"
|
||||
name="icon_landmark"
|
||||
top_pad="2"
|
||||
top="102"
|
||||
width="16" />
|
||||
<check_box
|
||||
height="16"
|
||||
|
|
@ -93,31 +93,14 @@
|
|||
name="check_landmark"
|
||||
top_delta="0"
|
||||
width="126" />
|
||||
<icon
|
||||
height="16"
|
||||
image_name="Inv_Mesh"
|
||||
layout="topleft"
|
||||
left="4"
|
||||
mouse_opaque="true"
|
||||
name="icon_mesh"
|
||||
top_pad="2"
|
||||
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"
|
||||
layout="topleft"
|
||||
left="4"
|
||||
left="8"
|
||||
mouse_opaque="true"
|
||||
name="icon_notecard"
|
||||
top_pad="2"
|
||||
top="122"
|
||||
width="16" />
|
||||
<check_box
|
||||
height="16"
|
||||
|
|
@ -127,14 +110,31 @@
|
|||
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"
|
||||
layout="topleft"
|
||||
left="4"
|
||||
left="8"
|
||||
mouse_opaque="true"
|
||||
name="icon_object"
|
||||
top_pad="2"
|
||||
top="162"
|
||||
width="16" />
|
||||
<check_box
|
||||
height="16"
|
||||
|
|
@ -148,10 +148,10 @@
|
|||
height="16"
|
||||
image_name="Inv_Script"
|
||||
layout="topleft"
|
||||
left="4"
|
||||
left="8"
|
||||
mouse_opaque="true"
|
||||
name="icon_script"
|
||||
top_pad="2"
|
||||
top="182"
|
||||
width="16" />
|
||||
<check_box
|
||||
height="16"
|
||||
|
|
@ -165,10 +165,10 @@
|
|||
height="16"
|
||||
image_name="Inv_Sound"
|
||||
layout="topleft"
|
||||
left="4"
|
||||
left="8"
|
||||
mouse_opaque="true"
|
||||
name="icon_sound"
|
||||
top_pad="2"
|
||||
top="202"
|
||||
width="16" />
|
||||
<check_box
|
||||
height="16"
|
||||
|
|
@ -182,10 +182,10 @@
|
|||
height="16"
|
||||
image_name="Inv_Texture"
|
||||
layout="topleft"
|
||||
left="4"
|
||||
left="8"
|
||||
mouse_opaque="true"
|
||||
name="icon_texture"
|
||||
top_pad="2"
|
||||
top="222"
|
||||
width="16" />
|
||||
<check_box
|
||||
height="16"
|
||||
|
|
@ -199,10 +199,10 @@
|
|||
height="16"
|
||||
image_name="Inv_Snapshot"
|
||||
layout="topleft"
|
||||
left="4"
|
||||
left="8"
|
||||
mouse_opaque="true"
|
||||
name="icon_snapshot"
|
||||
top_pad="2"
|
||||
top="242"
|
||||
width="16" />
|
||||
<check_box
|
||||
height="16"
|
||||
|
|
@ -218,30 +218,38 @@
|
|||
label="All"
|
||||
label_selected="All"
|
||||
layout="topleft"
|
||||
left="4"
|
||||
left="8"
|
||||
name="All"
|
||||
top_pad="4"
|
||||
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,44 +265,82 @@
|
|||
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|left"
|
||||
follows="top|right"
|
||||
height="20"
|
||||
label="Close"
|
||||
label_selected="Close"
|
||||
layout="topleft"
|
||||
name="Close"
|
||||
left_pad="-76"
|
||||
top_pad="10"
|
||||
right="-6"
|
||||
top="406"
|
||||
width="76" />
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -9,22 +9,14 @@
|
|||
save_rect="true"
|
||||
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">
|
||||
title="TWITTER"
|
||||
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"
|
||||
|
|
@ -34,26 +26,22 @@
|
|||
filename="panel_twitter_photo.xml"
|
||||
class="lltwitterphotopanel"
|
||||
follows="all"
|
||||
label="Compose"
|
||||
label="COMPOSE"
|
||||
name="panel_twitter_photo"/>
|
||||
<panel
|
||||
filename="panel_twitter_account.xml"
|
||||
class="lltwitteraccountpanel"
|
||||
follows="all"
|
||||
label="Account"
|
||||
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>
|
||||
|
|
|
|||
|
|
@ -162,7 +162,7 @@
|
|||
<menu_item_separator
|
||||
layout="topleft" />
|
||||
<menu_item_call
|
||||
label="Show Filters"
|
||||
label="Show Filters..."
|
||||
layout="topleft"
|
||||
name="show_filters">
|
||||
<on_click
|
||||
|
|
|
|||
|
|
@ -168,6 +168,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"
|
||||
|
|
@ -4870,6 +4880,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"
|
||||
|
|
|
|||
|
|
@ -1,78 +0,0 @@
|
|||
<panel
|
||||
height="392"
|
||||
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="13"
|
||||
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"
|
||||
right="-12"
|
||||
visible="false">
|
||||
<commit_callback function="SocialSharing.Disconnect"/>
|
||||
</button>
|
||||
<text
|
||||
layout="topleft"
|
||||
length="1"
|
||||
follows="top|left"
|
||||
height="16"
|
||||
left="0"
|
||||
right="-5"
|
||||
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>
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
<panel
|
||||
height="392"
|
||||
width="304"
|
||||
height="400"
|
||||
width="272"
|
||||
layout="topleft"
|
||||
follows="all"
|
||||
name="panel_facebook_friends">
|
||||
|
|
@ -9,18 +9,21 @@
|
|||
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="false"
|
||||
bg_alpha_color="DkGray2"
|
||||
bg_opaque_color="DkGray2"
|
||||
follows="all"
|
||||
height="386"
|
||||
height="383"
|
||||
layout="topleft"
|
||||
left="3"
|
||||
left="10"
|
||||
name="friends_accordion"
|
||||
right="-2"
|
||||
right="-10"
|
||||
top_pad="2">
|
||||
<accordion_tab
|
||||
layout="topleft"
|
||||
height="192"
|
||||
height="173"
|
||||
name="tab_second_life_friends"
|
||||
title="SL friends">
|
||||
<avatar_list
|
||||
|
|
@ -33,11 +36,11 @@
|
|||
name="second_life_friends"
|
||||
show_permissions_granted="true"
|
||||
top="0"
|
||||
width="307" />
|
||||
width="272" />
|
||||
</accordion_tab>
|
||||
<accordion_tab
|
||||
layout="topleft"
|
||||
height="192"
|
||||
height="173"
|
||||
name="tab_suggested_friends"
|
||||
title="Add these people as SL friends">
|
||||
<avatar_list
|
||||
|
|
@ -50,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>
|
||||
|
|
|
|||
|
|
@ -1,29 +1,19 @@
|
|||
<panel
|
||||
height="392"
|
||||
width="304"
|
||||
height="400"
|
||||
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="0">
|
||||
<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,19 +52,48 @@
|
|||
</combo_box>
|
||||
<panel
|
||||
height="150"
|
||||
right="-12"
|
||||
width="252"
|
||||
visible="true"
|
||||
layout="topleft"
|
||||
name="thumbnail_placeholder"
|
||||
top="25"
|
||||
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"
|
||||
top_pad="20"
|
||||
left="10"
|
||||
top_pad="5"
|
||||
name="new_snapshot_btn"
|
||||
tool_tip="Click to refresh"
|
||||
visible="true"
|
||||
|
|
@ -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,41 +130,39 @@
|
|||
</text>
|
||||
<text_editor
|
||||
follows="left|top|right|bottom"
|
||||
layout="topleft"
|
||||
height="87"
|
||||
right="-12"
|
||||
left="9"
|
||||
width="250"
|
||||
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"
|
||||
width="135">
|
||||
width="100">
|
||||
<button.commit_callback
|
||||
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="135">
|
||||
width="100">
|
||||
<button.commit_callback
|
||||
function="SocialSharing.Cancel" />
|
||||
</button>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
</button>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -1,133 +1,113 @@
|
|||
<panel
|
||||
height="392"
|
||||
width="304"
|
||||
height="400"
|
||||
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="0">
|
||||
<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"
|
||||
right="-12"
|
||||
left="9"
|
||||
layout="topleft"
|
||||
height="70"
|
||||
width="250"
|
||||
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"
|
||||
width="135">
|
||||
width="100">
|
||||
<button.commit_callback
|
||||
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="135">
|
||||
width="100">
|
||||
<button.commit_callback
|
||||
function="SocialSharing.Cancel" />
|
||||
</button>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -1,68 +1,130 @@
|
|||
<panel
|
||||
height="392"
|
||||
width="304"
|
||||
height="400"
|
||||
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="0">
|
||||
<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"
|
||||
right="-12"
|
||||
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"
|
||||
width="135">
|
||||
width="100">
|
||||
<button.commit_callback
|
||||
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="135">
|
||||
width="100">
|
||||
<button.commit_callback
|
||||
function="SocialSharing.Cancel" />
|
||||
</button>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel
|
||||
follows="all"
|
||||
height="380"
|
||||
height="319"
|
||||
layout="topleft"
|
||||
name="panel_postcard_message"
|
||||
width="490">
|
||||
|
|
@ -13,7 +12,7 @@
|
|||
font="SansSerif"
|
||||
height="16"
|
||||
layout="topleft"
|
||||
left="12"
|
||||
left="5"
|
||||
name="to_label"
|
||||
top="10"
|
||||
width="60">
|
||||
|
|
@ -26,7 +25,7 @@
|
|||
layout="topleft"
|
||||
left_pad="10"
|
||||
name="to_form"
|
||||
right="-10"
|
||||
right="-3"
|
||||
top_delta="-4" />
|
||||
<text
|
||||
type="string"
|
||||
|
|
@ -36,7 +35,7 @@
|
|||
font="SansSerif"
|
||||
height="16"
|
||||
layout="topleft"
|
||||
left="12"
|
||||
left="5"
|
||||
name="name_label"
|
||||
width="60">
|
||||
From:
|
||||
|
|
@ -48,7 +47,7 @@
|
|||
left_pad="10"
|
||||
max_length_bytes="100"
|
||||
name="name_form"
|
||||
right="-10"
|
||||
right="-3"
|
||||
top_delta="-4" />
|
||||
<text
|
||||
type="string"
|
||||
|
|
@ -58,7 +57,7 @@
|
|||
font="SansSerif"
|
||||
height="16"
|
||||
layout="topleft"
|
||||
left="12"
|
||||
left="5"
|
||||
name="subject_label"
|
||||
width="60">
|
||||
Subject:
|
||||
|
|
@ -66,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="all"
|
||||
height="276"
|
||||
follows="left|top|right"
|
||||
height="48"
|
||||
layout="topleft"
|
||||
left="12"
|
||||
left="5"
|
||||
max_length="700"
|
||||
name="msg_form"
|
||||
right="-10"
|
||||
top_pad="3"
|
||||
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
|
||||
bottom="-1"
|
||||
follows="right|bottom"
|
||||
height="23"
|
||||
label="Send"
|
||||
layout="topleft"
|
||||
right="-10"
|
||||
name="send_btn"
|
||||
width="100">
|
||||
<button.commit_callback
|
||||
function="Postcard.Send" />
|
||||
</button>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -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,108 +34,55 @@
|
|||
name="Custom"
|
||||
value="[i-1,i-1]" />
|
||||
</combo_box>
|
||||
<layout_stack
|
||||
animate="false"
|
||||
follows="all"
|
||||
height="375"
|
||||
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"
|
||||
control_name="LastSnapshotToEmailWidth"
|
||||
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"
|
||||
control_name="LastSnapshotToEmailHeight"
|
||||
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
|
||||
control_name="KeepAspectForEmailSnapshot"
|
||||
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
|
||||
control_name="SnapshotQuality"
|
||||
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="200" />
|
||||
<text
|
||||
type="string"
|
||||
follows="left|top"
|
||||
font="SansSerifSmall"
|
||||
length="1"
|
||||
height="14"
|
||||
layout="topleft"
|
||||
left="85"
|
||||
top="30"
|
||||
halign="left"
|
||||
name="image_quality_level"
|
||||
top_delta="0"
|
||||
width="105">
|
||||
([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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -48,7 +48,10 @@ Go to 'Welcome Island Public' 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.
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -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"Firestorm 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("Firestorm_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 Firestorm 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://www.firestormviewer.org \n"
|
||||
L"to download the latest version of Firestorm.\n",
|
||||
NULL, MB_OK);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (cancelled)
|
||||
{
|
||||
// silently exit
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!success)
|
||||
{
|
||||
MessageBox(gWindow,
|
||||
L"Firestorm 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;
|
||||
}
|
||||
Loading…
Reference in New Issue