Exemple #1
0
void LLNearbyChatToastPanel::addMessage(LLSD& notification)
{
	std::string		messageText = notification["message"].asString();		// UTF-8 line of text

	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);

	std::string color_name = notification["text_color"].asString();
	
	LLColor4 textColor = LLUIColorTable::instance().getColor(color_name);
	textColor.mV[VALPHA] =notification["color_alpha"].asReal();
	
	S32 font_size = notification["font_size"].asInteger();

	LLFontGL*       messageFont;
	switch(font_size)
	{
		case 0:	messageFont = LLFontGL::getFontSansSerifSmall(); break;
		default:
		case 1: messageFont = LLFontGL::getFontSansSerif();	    break;
		case 2:	messageFont = LLFontGL::getFontSansSerifBig();	break;
	}

	//append text
	{
		LLStyle::Params style_params;
		style_params.color(textColor);
		std::string font_name = LLFontGL::nameFromFont(messageFont);
		std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
		style_params.font.name(font_name);
		style_params.font.size(font_style_size);

		int chat_type = notification["chat_type"].asInteger();

		if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
		{
			// italics for emotes -Zi
			if(gSavedSettings.getBOOL("EmotesUseItalic"))
				style_params.font.style = "ITALIC";
		}
		else if( chat_type == CHAT_TYPE_SHOUT)
		{
			style_params.font.style = "BOLD";
		}
		else if( chat_type == CHAT_TYPE_WHISPER)
		{
			style_params.font.style = "ITALIC";
		}
		msg_text->appendText(messageText, TRUE, style_params);
	}

	snapToMessageHeight();

}
BOOL LLToastScriptQuestion::postBuild()
{
	createButtons();

	LLTextBox* mMessage = getChild<LLTextBox>("top_info_message");
	LLTextBox* mFooter = getChild<LLTextBox>("bottom_info_message");

	mMessage->setValue(mNotification->getMessage());
	mFooter->setValue(mNotification->getFooter());

	snapToMessageHeight();

	return TRUE;
}
LLPanelOnlineStatus::LLPanelOnlineStatus(
		const LLNotificationPtr& notification) :
	LLPanelTipToast(notification)
{

	buildFromFile(
			"panel_online_status_toast.xml");


	getChild<LLUICtrl>("avatar_icon")->setValue(notification->getPayload()["FROM_ID"]);
	getChild<LLUICtrl>("message")->setValue(notification->getMessage());

	if (notification->getPayload().has("respond_on_mousedown")
			&& notification->getPayload()["respond_on_mousedown"])
	{
		setMouseDownCallback(boost::bind(&LLNotification::respond,
				notification, notification->getResponseTemplate()));
	}

	S32 max_line_count =  gSavedSettings.getS32("TipToastMessageLineCount");
	snapToMessageHeight(getChild<LLTextBox> ("message"), max_line_count);

}
LLToastNotifyPanel::LLToastNotifyPanel(LLNotificationPtr& notification, const LLRect& rect) : 
LLToastPanel(notification),
mTextBox(NULL),
mInfoPanel(NULL),
mControlPanel(NULL),
mNumOptions(0),
mNumButtons(0),
mAddedDefaultBtn(false),
mCloseNotificationOnDestroy(true)
{
	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_notification.xml");
	if(rect != LLRect::null)
	{
		this->setShape(rect);
	}		 
	mInfoPanel = getChild<LLPanel>("info_panel");
	mControlPanel = getChild<LLPanel>("control_panel");
	BUTTON_WIDTH = gSavedSettings.getS32("ToastButtonWidth");
	// customize panel's attributes
	// is it intended for displaying a tip
	mIsTip = notification->getType() == "notifytip";
	// is it a script dialog
	mIsScriptDialog = (notification->getName() == "ScriptDialog" || notification->getName() == "ScriptDialogGroup");
	// is it a caution
	//
	// caution flag can be set explicitly by specifying it in the notification payload, or it can be set implicitly if the
	// notify xml template specifies that it is a caution
	// tip-style notification handle 'caution' differently -they display the tip in a different color
	mIsCaution = notification->getPriority() >= NOTIFICATION_PRIORITY_HIGH;

	// setup parameters
	// get a notification message
	mMessage = notification->getMessage();
	// init font variables
	if (!sFont)
	{
		sFont = LLFontGL::getFontSansSerif();
		sFontSmall = LLFontGL::getFontSansSerifSmall();
	}
	// clicking on a button does not steal current focus
	setIsChrome(TRUE);
	// initialize
	setFocusRoot(!mIsTip);
	// get a form for the notification
	LLNotificationFormPtr form(notification->getForm());
	// get number of elements
	mNumOptions = form->getNumElements();

	// customize panel's outfit
	// preliminary adjust panel's layout
	//move to the end 
	//mIsTip ? adjustPanelForTipNotice() : adjustPanelForScriptNotice(form);

	// adjust text options according to the notification type
	// add a caution textbox at the top of a caution notification
	if (mIsCaution && !mIsTip)
	{
		mTextBox = getChild<LLTextBox>("caution_text_box");
	}
	else
	{
		mTextBox = getChild<LLTextEditor>("text_editor_box"); 
	}

	// *TODO: magic numbers(???) - copied from llnotify.cpp(250)
	const S32 MAX_LENGTH = 512 + 20 + DB_FIRST_NAME_BUF_SIZE + DB_LAST_NAME_BUF_SIZE + DB_INV_ITEM_NAME_BUF_SIZE; 

	mTextBox->setMaxTextLength(MAX_LENGTH);
	mTextBox->setVisible(TRUE);
	mTextBox->setValue(notification->getMessage());

	// add buttons for a script notification
	if (mIsTip)
	{
		adjustPanelForTipNotice();
	}
	else
	{
		std::vector<index_button_pair_t> buttons;
		buttons.reserve(mNumOptions);
		S32 buttons_width = 0;
		// create all buttons and accumulate they total width to reshape mControlPanel
		for (S32 i = 0; i < mNumOptions; i++)
		{
			LLSD form_element = form->getElement(i);
			if (form_element["type"].asString() != "button")
			{
				continue;
			}
			LLButton* new_button = createButton(form_element, TRUE);
			buttons_width += new_button->getRect().getWidth();
			S32 index = form_element["index"].asInteger();
			buttons.push_back(index_button_pair_t(index,new_button));
		}
		if (buttons.empty())
		{
			addDefaultButton();
		}
		else
		{
			const S32 button_panel_width = mControlPanel->getRect().getWidth();// do not change width of the panel
			S32 button_panel_height = mControlPanel->getRect().getHeight();
			//try get an average h_pad to spread out buttons
			S32 h_pad = (button_panel_width - buttons_width) / (S32(buttons.size()));
			if(h_pad < 2*HPAD)
			{
				/*
				 * Probably it is  a scriptdialog toast
				 * for a scriptdialog toast h_pad can be < 2*HPAD if we have a lot of buttons.
				 * In last case set default h_pad to avoid heaping of buttons 
				 */
				S32 button_per_row = button_panel_width / BUTTON_WIDTH;
				h_pad = (button_panel_width % BUTTON_WIDTH) / (button_per_row - 1);// -1  because we do not need space after last button in a row   
				if(h_pad < 2*HPAD) // still not enough space between buttons ?
				{
					h_pad = 2*HPAD;
				}
			}
			if (mIsScriptDialog)
			{
				// we are using default width for script buttons so we can determinate button_rows
				//to get a number of rows we divide the required width of the buttons to button_panel_width
				S32 button_rows = llceil(F32(buttons.size() - 1) * (BUTTON_WIDTH + h_pad) / button_panel_width);
				//S32 button_rows = (buttons.size() - 1) * (BUTTON_WIDTH + h_pad) / button_panel_width;
				//reserve one row for the ignore_btn
				button_rows++;
				//calculate required panel height for scripdialog notification.
				button_panel_height = button_rows * (BTN_HEIGHT + VPAD)	+ IGNORE_BTN_TOP_DELTA + BOTTOM_PAD;
			}
			else
			{
				// in common case buttons can have different widths so we need to calculate button_rows according to buttons_width
				//S32 button_rows = llceil(F32(buttons.size()) * (buttons_width + h_pad) / button_panel_width);
				S32 button_rows = llceil(F32((buttons.size() - 1) * h_pad + buttons_width) / button_panel_width);
				//calculate required panel height 
				button_panel_height = button_rows * (BTN_HEIGHT + VPAD)	+ BOTTOM_PAD;
			}
		
			// we need to keep min width and max height to make visible all buttons, because width of the toast can not be changed
			adjustPanelForScriptNotice(button_panel_width, button_panel_height);
			updateButtonsLayout(buttons, h_pad);
			// save buttons for later use in disableButtons()
			mButtons.assign(buttons.begin(), buttons.end());
		}
	}
	// adjust panel's height to the text size
	mInfoPanel->setFollowsAll();
	snapToMessageHeight(mTextBox, MAX_LENGTH);

	if(notification->isReusable())
	{
		mButtonClickConnection = sButtonClickSignal.connect(
			boost::bind(&LLToastNotifyPanel::onToastPanelButtonClicked, this, _1, _2));

		if(notification->isRespondedTo())
		{
			// User selected an option in toast, now disable required buttons in IM window
			disableRespondedOptions(notification);
		}
	}
}
Exemple #5
0
void LLNearbyChatToastPanel::init(LLSD& notification)
{
	std::string		messageText = notification["message"].asString();		// UTF-8 line of text
	std::string		fromName = notification["from"].asString();	// agent or object name
	mFromID = notification["from_id"].asUUID();		// agent id or object id
	mFromName = fromName;

// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
	mShowIconTooltip = notification.has("show_icon_tooltip") ? notification["show_icon_tooltip"].asBoolean() : true;
// [/RLVa:KB]

	int sType = notification["source"].asInteger();
    mSourceType = (EChatSourceType)sType;
	
	std::string color_name = notification["text_color"].asString();
	
	LLColor4 textColor = LLUIColorTable::instance().getColor(color_name);
	textColor.mV[VALPHA] =notification["color_alpha"].asReal();
	
	S32 font_size = notification["font_size"].asInteger();

	LLFontGL*       messageFont;
	switch(font_size)
	{
		case 0:	messageFont = LLFontGL::getFontSansSerifSmall(); break;
		default:
		case 1: messageFont = LLFontGL::getFontSansSerif();	    break;
		case 2:	messageFont = LLFontGL::getFontSansSerifBig();	break;
	}
	
	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);

	msg_text->setText(std::string(""));

	if ( notification["chat_style"].asInteger() != CHAT_STYLE_IRC )
	{
		std::string str_sender;

		str_sender = fromName;

		str_sender+=" ";

		//append sender name
		if (mSourceType == CHAT_SOURCE_AGENT || mSourceType == CHAT_SOURCE_OBJECT)
		{
			LLStyle::Params style_params_name;

			LLColor4 user_name_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
			style_params_name.color(user_name_color);

			std::string font_name = LLFontGL::nameFromFont(messageFont);
			std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
			style_params_name.font.name(font_name);
			style_params_name.font.size(font_style_size);

			style_params_name.link_href = notification["sender_slurl"].asString();
			style_params_name.is_link = true;

			msg_text->appendText(str_sender, FALSE, style_params_name);

		}
		else
		{
			msg_text->appendText(str_sender, false);
		}
	}

	//append text
	{
		LLStyle::Params style_params;
		style_params.color(textColor);
		std::string font_name = LLFontGL::nameFromFont(messageFont);
		std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
		style_params.font.name(font_name);
		style_params.font.size(font_style_size);

		int chat_type = notification["chat_type"].asInteger();

		if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
		{
			style_params.font.style = "ITALIC";
		}
		else if( chat_type == CHAT_TYPE_SHOUT)
		{
			style_params.font.style = "BOLD";
		}
		else if( chat_type == CHAT_TYPE_WHISPER)
		{
			style_params.font.style = "ITALIC";
		}
		msg_text->appendText(messageText, FALSE, style_params);
	}


	snapToMessageHeight();

	mIsDirty = true;//will set Avatar Icon in draw
}
void LLIMToastNotifyPanel::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)
{
    LLToastPanel::reshape(width, height, called_from_parent);
    snapToMessageHeight();
}
void LLToastNotifyPanel::init( LLRect rect, bool show_images )
{
    deleteAllChildren();

    mTextBox = NULL;
    mInfoPanel = NULL;
    mControlPanel = NULL;
    mNumOptions = 0;
    mNumButtons = 0;
    mAddedDefaultBtn = false;

    LLRect current_rect = getRect();

    setXMLFilename("");
    buildFromFile("panel_notification.xml");

    if(rect != LLRect::null)
    {
        this->setShape(rect);
    }
    mInfoPanel = getChild<LLPanel>("info_panel");

    mControlPanel = getChild<LLPanel>("control_panel");
    BUTTON_WIDTH = gSavedSettings.getS32("ToastButtonWidth");
    // customize panel's attributes
    // is it intended for displaying a tip?
    mIsTip = mNotification->getType() == "notifytip";

    std::string notif_name = mNotification->getName();
    // is it a script dialog?
    mIsScriptDialog = (notif_name == "ScriptDialog" || notif_name == "ScriptDialogGroup");

    bool is_content_trusted = (notif_name != "LoadWebPage");
    // is it a caution?
    //
    // caution flag can be set explicitly by specifying it in the notification payload, or it can be set implicitly if the
    // notify xml template specifies that it is a caution
    // tip-style notification handle 'caution' differently -they display the tip in a different color
    mIsCaution = mNotification->getPriority() >= NOTIFICATION_PRIORITY_HIGH;

    // setup parameters
    // get a notification message
    mMessage = mNotification->getMessage();
    // init font variables
    if (!sFont)
    {
        sFont = LLFontGL::getFontSansSerif();
        sFontSmall = LLFontGL::getFontSansSerifSmall();
    }
    // initialize
    setFocusRoot(!mIsTip);
    // get a form for the notification
    LLNotificationFormPtr form(mNotification->getForm());
    // get number of elements
    mNumOptions = form->getNumElements();

    // customize panel's outfit
    // preliminary adjust panel's layout
    //move to the end
    //mIsTip ? adjustPanelForTipNotice() : adjustPanelForScriptNotice(form);

    // adjust text options according to the notification type
    // add a caution textbox at the top of a caution notification
    if (mIsCaution && !mIsTip)
    {
        mTextBox = getChild<LLTextBox>("caution_text_box");
    }
    else
    {
        mTextBox = getChild<LLTextEditor>("text_editor_box");
    }

    mTextBox->setMaxTextLength(MAX_LENGTH);
    mTextBox->setVisible(TRUE);
    mTextBox->setPlainText(!show_images);
    mTextBox->setContentTrusted(is_content_trusted);
    mTextBox->setValue(mNotification->getMessage());
    mTextBox->setIsFriendCallback(LLAvatarActions::isFriend);

    // add buttons for a script notification
    if (mIsTip)
    {
        adjustPanelForTipNotice();
    }
    else
    {
        std::vector<index_button_pair_t> buttons;
        buttons.reserve(mNumOptions);
        S32 buttons_width = 0;
        // create all buttons and accumulate they total width to reshape mControlPanel
        for (S32 i = 0; i < mNumOptions; i++)
        {
            LLSD form_element = form->getElement(i);
            if (form_element["type"].asString() != "button")
            {
                // not a button.
                continue;
            }
            if (form_element["name"].asString() == TEXTBOX_MAGIC_TOKEN)
            {
                // a textbox pretending to be a button.
                continue;
            }
            LLButton* new_button = createButton(form_element, TRUE);
            buttons_width += new_button->getRect().getWidth();
            S32 index = form_element["index"].asInteger();
            buttons.push_back(index_button_pair_t(index,new_button));
        }
        if (buttons.empty())
        {
            addDefaultButton();
        }
        else
        {
            const S32 button_panel_width = mControlPanel->getRect().getWidth();// do not change width of the panel
            S32 button_panel_height = mControlPanel->getRect().getHeight();
            //try get an average h_pad to spread out buttons
            S32 h_pad = (button_panel_width - buttons_width) / (S32(buttons.size()));
            if(h_pad < 2*HPAD)
            {
                /*
                 * Probably it is a scriptdialog toast
                 * for a scriptdialog toast h_pad can be < 2*HPAD if we have a lot of buttons.
                 * In last case set default h_pad to avoid heaping of buttons
                 */
                S32 button_per_row = button_panel_width / BUTTON_WIDTH;
                h_pad = (button_panel_width % BUTTON_WIDTH) / (button_per_row - 1);// -1  because we do not need space after last button in a row
                if(h_pad < 2*HPAD) // still not enough space between buttons ?
                {
                    h_pad = 2*HPAD;
                }
            }
            if (mIsScriptDialog)
            {
                // we are using default width for script buttons so we can determinate button_rows
                //to get a number of rows we divide the required width of the buttons to button_panel_width
                S32 button_rows = llceil(F32(buttons.size() - 1) * (BUTTON_WIDTH + h_pad) / button_panel_width);
                //S32 button_rows = (buttons.size() - 1) * (BUTTON_WIDTH + h_pad) / button_panel_width;
                //reserve one row for the ignore_btn
                button_rows++;
                //calculate required panel height for scripdialog notification.
                button_panel_height = button_rows * (BTN_HEIGHT + VPAD)	+ IGNORE_BTN_TOP_DELTA + BOTTOM_PAD;
            }
            else
            {
                // in common case buttons can have different widths so we need to calculate button_rows according to buttons_width
                //S32 button_rows = llceil(F32(buttons.size()) * (buttons_width + h_pad) / button_panel_width);
                S32 button_rows = llceil(F32((buttons.size() - 1) * h_pad + buttons_width) / button_panel_width);
                //calculate required panel height
                button_panel_height = button_rows * (BTN_HEIGHT + VPAD)	+ BOTTOM_PAD;
            }

            // we need to keep min width and max height to make visible all buttons, because width of the toast can not be changed
            adjustPanelForScriptNotice(button_panel_width, button_panel_height);
            updateButtonsLayout(buttons, h_pad);
            // save buttons for later use in disableButtons()
            //mButtons.assign(buttons.begin(), buttons.end());
        }
    }

    //.xml file intially makes info panel only follow left/right/top. This is so that when control buttons are added the info panel
    //can shift upward making room for the buttons inside mControlPanel. After the buttons are added, the info panel can then be set to follow 'all'.
    mInfoPanel->setFollowsAll();
    snapToMessageHeight(mTextBox, MAX_LENGTH);

    // reshape the panel to its previous size
    if (current_rect.notEmpty())
    {
        reshape(current_rect.getWidth(), current_rect.getHeight());
    }
}