00001
00032 #include "llviewerprecompiledheaders.h"
00033
00034 #include "llfloatergesture.h"
00035
00036 #include "lldir.h"
00037 #include "llinventory.h"
00038 #include "llmultigesture.h"
00039
00040 #include "llagent.h"
00041 #include "llviewerwindow.h"
00042 #include "llbutton.h"
00043 #include "llcombobox.h"
00044 #include "llgesturemgr.h"
00045 #include "llinventorymodel.h"
00046 #include "llinventoryview.h"
00047 #include "llkeyboard.h"
00048 #include "lllineeditor.h"
00049 #include "llpreviewgesture.h"
00050 #include "llresizehandle.h"
00051 #include "llscrollbar.h"
00052 #include "llscrollcontainer.h"
00053 #include "llscrolllistctrl.h"
00054 #include "lltextbox.h"
00055 #include "lluictrlfactory.h"
00056 #include "llviewergesture.h"
00057 #include "llviewerimagelist.h"
00058 #include "llviewerinventory.h"
00059 #include "llvoavatar.h"
00060 #include "llviewercontrol.h"
00061
00062
00063 LLFloaterGesture* LLFloaterGesture::sInstance = NULL;
00064 LLFloaterGestureObserver* LLFloaterGesture::sObserver = NULL;
00065
00066 BOOL item_name_precedes( LLInventoryItem* a, LLInventoryItem* b )
00067 {
00068 return LLString::precedesDict( a->getName(), b->getName() );
00069 }
00070
00071 class LLFloaterGestureObserver : public LLGestureManagerObserver
00072 {
00073 public:
00074 LLFloaterGestureObserver() {}
00075 virtual ~LLFloaterGestureObserver() {}
00076 virtual void changed() { LLFloaterGesture::refreshAll(); }
00077 };
00078
00079
00080
00081
00082 LLFloaterGesture::LLFloaterGesture()
00083 : LLFloater("Gesture Floater")
00084 {
00085 sInstance = this;
00086
00087 sObserver = new LLFloaterGestureObserver;
00088 gGestureManager.addObserver(sObserver);
00089 }
00090
00091
00092 LLFloaterGesture::~LLFloaterGesture()
00093 {
00094 gGestureManager.removeObserver(sObserver);
00095 delete sObserver;
00096 sObserver = NULL;
00097
00098 sInstance = NULL;
00099
00100
00101
00102 gSavedSettings.setRect("FloaterGestureRect2", getRect());
00103 }
00104
00105
00106 BOOL LLFloaterGesture::postBuild()
00107 {
00108 LLString label;
00109
00110
00111 label = getTitle();
00112
00113 setTitle(label);
00114
00115 childSetCommitCallback("gesture_list", onCommitList, this);
00116 childSetDoubleClickCallback("gesture_list", onClickPlay);
00117
00118 childSetAction("inventory_btn", onClickInventory, this);
00119
00120 childSetAction("edit_btn", onClickEdit, this);
00121
00122 childSetAction("play_btn", onClickPlay, this);
00123 childSetAction("stop_btn", onClickPlay, this);
00124
00125 childSetAction("new_gesture_btn", onClickNew, this);
00126
00127 childSetVisible("play_btn", true);
00128 childSetVisible("stop_btn", false);
00129 setDefaultBtn("play_btn");
00130
00131 return TRUE;
00132 }
00133
00134
00135
00136 void LLFloaterGesture::show()
00137 {
00138 if (sInstance)
00139 {
00140 sInstance->open();
00141 return;
00142 }
00143
00144 LLFloaterGesture *self = new LLFloaterGesture();
00145
00146
00147 LLUICtrlFactory::getInstance()->buildFloater(self, "floater_gesture.xml");
00148
00149
00150 LLRect rect = gSavedSettings.getRect("FloaterGestureRect2");
00151 self->reshape(rect.getWidth(), rect.getHeight());
00152 self->setRect(rect);
00153
00154 self->buildGestureList();
00155
00156 self->childSetFocus("gesture_list");
00157
00158 LLCtrlListInterface *list = self->childGetListInterface("gesture_list");
00159 if (list)
00160 {
00161 const BOOL ascending = TRUE;
00162 list->sortByColumn("name", ascending);
00163 list->selectFirstItem();
00164 }
00165
00166 self->mSelectedID = LLUUID::null;
00167
00168
00169 onCommitList(NULL, self);
00170 self->open();
00171 }
00172
00173
00174 void LLFloaterGesture::toggleVisibility()
00175 {
00176 if(sInstance && sInstance->getVisible())
00177 {
00178 sInstance->close();
00179 }
00180 else
00181 {
00182 show();
00183 }
00184 }
00185
00186
00187 void LLFloaterGesture::refreshAll()
00188 {
00189 if (sInstance)
00190 {
00191 sInstance->buildGestureList();
00192
00193 LLCtrlListInterface *list = sInstance->childGetListInterface("gesture_list");
00194 if (!list) return;
00195
00196 if (sInstance->mSelectedID.isNull())
00197 {
00198 list->selectFirstItem();
00199 }
00200 else
00201 {
00202 if (list->setCurrentByID(sInstance->mSelectedID))
00203 {
00204 LLCtrlScrollInterface *scroll = sInstance->childGetScrollInterface("gesture_list");
00205 if (scroll) scroll->scrollToShowSelected();
00206 }
00207 else
00208 {
00209 list->selectFirstItem();
00210 }
00211 }
00212
00213
00214 onCommitList(NULL, sInstance);
00215 }
00216 }
00217
00218 void LLFloaterGesture::buildGestureList()
00219 {
00220 LLCtrlListInterface *list = childGetListInterface("gesture_list");
00221 if (!list) return;
00222
00223 list->operateOnAll(LLCtrlListInterface::OP_DELETE);
00224
00225 LLGestureManager::item_map_t::iterator it;
00226 for (it = gGestureManager.mActive.begin(); it != gGestureManager.mActive.end(); ++it)
00227 {
00228 const LLUUID& item_id = (*it).first;
00229 LLMultiGesture* gesture = (*it).second;
00230
00231
00232 std::string item_name = "Loading...";
00233 LLInventoryItem* item = gInventory.getItem(item_id);
00234 if (item)
00235 {
00236 item_name = item->getName();
00237 }
00238
00239 LLString font_style = "NORMAL";
00240
00241
00242 LLSD element;
00243 element["id"] = item_id;
00244
00245 if (gesture)
00246 {
00247 if (gesture->mPlaying)
00248 {
00249 font_style = "BOLD";
00250 }
00251
00252 element["columns"][0]["column"] = "trigger";
00253 element["columns"][0]["value"] = gesture->mTrigger;
00254 element["columns"][0]["font"] = "SANSSERIF";
00255 element["columns"][0]["font-style"] = font_style;
00256
00257 LLString key_string = LLKeyboard::stringFromKey(gesture->mKey);
00258 LLString buffer;
00259
00260 {
00261 if (gesture->mKey == KEY_NONE)
00262 {
00263 buffer = "---";
00264 key_string = "~~~";
00265 }
00266 else
00267 {
00268 if (gesture->mMask & MASK_CONTROL) buffer.append("Ctrl-");
00269 if (gesture->mMask & MASK_ALT) buffer.append("Alt-");
00270 if (gesture->mMask & MASK_SHIFT) buffer.append("Shift-");
00271 if ((gesture->mMask & (MASK_CONTROL|MASK_ALT|MASK_SHIFT)) &&
00272 (key_string[0] == '-' || key_string[0] == '='))
00273 {
00274 buffer.append(" ");
00275 }
00276 buffer.append(key_string);
00277 }
00278 }
00279 element["columns"][1]["column"] = "shortcut";
00280 element["columns"][1]["value"] = buffer;
00281 element["columns"][1]["font"] = "SANSSERIF";
00282 element["columns"][1]["font-style"] = font_style;
00283
00284
00285 element["columns"][2]["column"] = "key";
00286 element["columns"][2]["value"] = key_string;
00287 element["columns"][2]["font"] = "SANSSERIF";
00288 element["columns"][2]["font-style"] = font_style;
00289
00290
00291 if (item && gesture->mPlaying)
00292 {
00293 item_name += " (Playing)";
00294 }
00295 element["columns"][3]["column"] = "name";
00296 element["columns"][3]["value"] = item_name;
00297 element["columns"][3]["font"] = "SANSSERIF";
00298 element["columns"][3]["font-style"] = font_style;
00299 }
00300 else
00301 {
00302 element["columns"][0]["column"] = "trigger";
00303 element["columns"][0]["value"] = "";
00304 element["columns"][0]["font"] = "SANSSERIF";
00305 element["columns"][0]["font-style"] = font_style;
00306 element["columns"][0]["column"] = "trigger";
00307 element["columns"][0]["value"] = "---";
00308 element["columns"][0]["font"] = "SANSSERIF";
00309 element["columns"][0]["font-style"] = font_style;
00310 element["columns"][2]["column"] = "key";
00311 element["columns"][2]["value"] = "~~~";
00312 element["columns"][2]["font"] = "SANSSERIF";
00313 element["columns"][2]["font-style"] = font_style;
00314 element["columns"][3]["column"] = "name";
00315 element["columns"][3]["value"] = item_name;
00316 element["columns"][3]["font"] = "SANSSERIF";
00317 element["columns"][3]["font-style"] = font_style;
00318 }
00319 list->addElement(element, ADD_BOTTOM);
00320 }
00321 }
00322
00323
00324 void LLFloaterGesture::onClickInventory(void* data)
00325 {
00326 LLFloaterGesture* self = (LLFloaterGesture*)data;
00327
00328 LLCtrlListInterface *list = self->childGetListInterface("gesture_list");
00329 if (!list) return;
00330 const LLUUID& item_id = list->getCurrentID();
00331
00332 LLInventoryView* inv = LLInventoryView::showAgentInventory();
00333 if (!inv) return;
00334 inv->getPanel()->setSelection(item_id, TRUE);
00335 }
00336
00337
00338 void LLFloaterGesture::onClickPlay(void* data)
00339 {
00340 LLFloaterGesture* self = (LLFloaterGesture*)data;
00341
00342 LLCtrlListInterface *list = self->childGetListInterface("gesture_list");
00343 if (!list) return;
00344 const LLUUID& item_id = list->getCurrentID();
00345
00346 if (gGestureManager.isGesturePlaying(item_id))
00347 {
00348 gGestureManager.stopGesture(item_id);
00349 }
00350 else
00351 {
00352 gGestureManager.playGesture(item_id);
00353 }
00354 }
00355
00356 class GestureShowCallback : public LLInventoryCallback
00357 {
00358 public:
00359 GestureShowCallback(LLString &title)
00360 {
00361 mTitle = title;
00362 }
00363 void fire(const LLUUID &inv_item)
00364 {
00365 LLPreviewGesture::show(mTitle.c_str(), inv_item, LLUUID::null);
00366 }
00367 private:
00368 LLString mTitle;
00369 };
00370
00371
00372 void LLFloaterGesture::onClickNew(void* data)
00373 {
00374 LLString title("Gesture: ");
00375 title.append("New Gesture");
00376 LLPointer<LLInventoryCallback> cb = new GestureShowCallback(title);
00377 create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
00378 LLUUID::null, LLTransactionID::tnull, "New Gesture", "", LLAssetType::AT_GESTURE,
00379 LLInventoryType::IT_GESTURE, NOT_WEARABLE, PERM_MOVE | PERM_TRANSFER, cb);
00380 }
00381
00382
00383
00384 void LLFloaterGesture::onClickEdit(void* data)
00385 {
00386 LLFloaterGesture* self = (LLFloaterGesture*)data;
00387
00388 LLCtrlListInterface *list = self->childGetListInterface("gesture_list");
00389 if (!list) return;
00390 const LLUUID& item_id = list->getCurrentID();
00391
00392 LLInventoryItem* item = gInventory.getItem(item_id);
00393 if (!item) return;
00394
00395 LLString title("Gesture: ");
00396 title.append(item->getName());
00397
00398 LLPreviewGesture* previewp = LLPreviewGesture::show(title, item_id, LLUUID::null);
00399 if (!previewp->getHost())
00400 {
00401 previewp->setRect(gFloaterView->findNeighboringPosition(self, previewp));
00402 }
00403 }
00404
00405
00406 void LLFloaterGesture::onCommitList(LLUICtrl* ctrl, void* data)
00407 {
00408 LLFloaterGesture* self = (LLFloaterGesture*)data;
00409
00410 const LLUUID& item_id = self->childGetValue("gesture_list").asUUID();
00411
00412 self->mSelectedID = item_id;
00413 if (gGestureManager.isGesturePlaying(item_id))
00414 {
00415 self->childSetVisible("play_btn", false);
00416 self->childSetVisible("stop_btn", true);
00417 }
00418 else
00419 {
00420 self->childSetVisible("play_btn", true);
00421 self->childSetVisible("stop_btn", false);
00422 }
00423 }