From be5b6aa4de903c5fcd2c24cc1b99435bedce1184 Mon Sep 17 00:00:00 2001 From: xalduin Date: Tue, 1 Jun 2010 16:49:35 -0400 Subject: Sort by map name when opening map When opening a map, the list of map names is now sorted alphabetically. --- src/game/editor/ed_editor.cpp | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) (limited to 'src/game/editor/ed_editor.cpp') diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp index 480a6827..b2b3e1ca 100644 --- a/src/game/editor/ed_editor.cpp +++ b/src/game/editor/ed_editor.cpp @@ -1,7 +1,8 @@ // copyright (c) 2007 magnus auvinen, see licence.txt for more info #include - +#include +#include #include #include @@ -1885,21 +1886,21 @@ static char gs_FileDialogFileName[512] = {0}; static char gs_aFileDialogPath[512] = {0}; static char gs_aFileDialogCompleteFilename[512] = {0}; static int gs_FilesNum = 0; +static sorted_array gs_FileList; int g_FilesStartAt = 0; int g_FilesCur = 0; int g_FilesStopAt = 999; -struct CListDirInfo -{ - CUIRect *m_pRect; - CEditor *m_pEditor; -}; - static void EditorListdirCallback(const char *pName, int IsDir, void *pUser) { if(pName[0] == '.' || IsDir) // skip this shit! return; + gs_FileList.add(string(pName)); +} + +void CEditor::AddFileDialogEntry(const char *pName, CUIRect *pView) +{ if(g_FilesCur > gs_FilesNum) gs_FilesNum = g_FilesCur; @@ -1907,14 +1908,12 @@ static void EditorListdirCallback(const char *pName, int IsDir, void *pUser) if(g_FilesCur-1 < g_FilesStartAt || g_FilesCur > g_FilesStopAt) return; - CListDirInfo *pInfo = (CListDirInfo *)pUser; - CUIRect *pView = pInfo->m_pRect; CUIRect Button; pView->HSplitTop(15.0f, &Button, pView); pView->HSplitTop(2.0f, 0, pView); //char buf[512]; - if(pInfo->m_pEditor->DoButton_File((void*)(10+(int)Button.y), pName, 0, &Button, 0, 0)) + if(DoButton_File((void*)(10+(int)Button.y), pName, 0, &Button, 0, 0)) { str_copy(gs_FileDialogFileName, pName, sizeof(gs_FileDialogFileName)); @@ -1922,11 +1921,11 @@ static void EditorListdirCallback(const char *pName, int IsDir, void *pUser) str_append(gs_aFileDialogCompleteFilename, gs_aFileDialogPath, sizeof(gs_aFileDialogCompleteFilename)); str_append(gs_aFileDialogCompleteFilename, gs_FileDialogFileName, sizeof(gs_aFileDialogCompleteFilename)); - if(pInfo->m_pEditor->Input()->MouseDoubleClick()) + if(Input()->MouseDoubleClick()) { if(gs_pfnFileDialogFunc) - gs_pfnFileDialogFunc(gs_aFileDialogCompleteFilename, pInfo->m_pEditor); - pInfo->m_pEditor->m_Dialog = DIALOG_NONE; + gs_pfnFileDialogFunc(gs_aFileDialogCompleteFilename, this); + m_Dialog = DIALOG_NONE; } } } @@ -1997,13 +1996,12 @@ void CEditor::RenderFileDialog() // set clipping UI()->ClipEnable(&View); - // the list - CListDirInfo Info; - Info.m_pRect = &View; - Info.m_pEditor = this; - // TODO: lazy ass coding, should store the interface pointer somewere - Kernel()->RequestInterface()->ListDirectory(gs_FileDialogDirTypes, gs_aFileDialogPath, EditorListdirCallback, &Info); + Kernel()->RequestInterface()->ListDirectory(gs_FileDialogDirTypes, gs_aFileDialogPath, EditorListdirCallback, 0); + + for(int i = 0; i < gs_FileList.size(); i++) + AddFileDialogEntry(gs_FileList[i].cstr(), &View); + gs_FileList.clear(); // disable clipping again UI()->ClipDisable(); -- cgit 1.4.1 From a99cbfc74238136723a83913b809479267e3dfa2 Mon Sep 17 00:00:00 2001 From: xalduin Date: Wed, 2 Jun 2010 12:12:32 -0400 Subject: Image sorting working, less hackish --- src/game/editor/ed_editor.cpp | 68 +++++++++++++++++++++++++++++++++++++++++-- src/game/editor/ed_editor.h | 1 + 2 files changed, 67 insertions(+), 2 deletions(-) (limited to 'src/game/editor/ed_editor.cpp') diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp index b2b3e1ca..df40c48a 100644 --- a/src/game/editor/ed_editor.cpp +++ b/src/game/editor/ed_editor.cpp @@ -554,8 +554,24 @@ CQuad *CEditor::GetSelectedQuad() return 0; } -static void CallbackOpenMap(const char *pFileName, void *pUser) { if(((CEditor*)pUser)->Load(pFileName)) str_copy(((CEditor*)pUser)->m_aFileName, pFileName, 512); } -static void CallbackAppendMap(const char *pFileName, void *pUser) { if(((CEditor*)pUser)->Append(pFileName)) ((CEditor*)pUser)->m_aFileName[0] = 0; } +static void CallbackOpenMap(const char *pFileName, void *pUser) +{ + CEditor *pEditor = (CEditor*)pUser; + if(pEditor->Load(pFileName)) + { + str_copy(pEditor->m_aFileName, pFileName, 512); + pEditor->SortImages(); + } +} +static void CallbackAppendMap(const char *pFileName, void *pUser) +{ + CEditor *pEditor = (CEditor*)pUser; + if(pEditor->Append(pFileName)) + { + pEditor->m_aFileName[0] = 0; + pEditor->SortImages(); + } +} static void CallbackSaveMap(const char *pFileName, void *pUser){ if(((CEditor*)pUser)->Save(pFileName)) str_copy(((CEditor*)pUser)->m_aFileName, pFileName, 512); } void CEditor::DoToolbar(CUIRect ToolBar) @@ -1725,6 +1741,7 @@ void CEditor::ReplaceImage(const char *pFileName, void *pUser) *pImg = ImgInfo; ExtractName(pFileName, pImg->m_aName); pImg->m_TexId = pEditor->Graphics()->LoadTextureRaw(ImgInfo.m_Width, ImgInfo.m_Height, ImgInfo.m_Format, ImgInfo.m_pData, CImageInfo::FORMAT_AUTO, 0); + pEditor->SortImages(); } void CEditor::AddImage(const char *pFileName, void *pUser) @@ -1747,6 +1764,7 @@ void CEditor::AddImage(const char *pFileName, void *pUser) } pEditor->m_Map.m_lImages.add(pImg); + pEditor->SortImages(); } @@ -1809,9 +1827,55 @@ int CEditor::PopupImage(CEditor *pEditor, CUIRect View) return 0; } +static int CompareImageName(const void *pObject1, const void *pObject2) +{ + CEditorImage *pImage1 = *(CEditorImage**)pObject1; + CEditorImage *pImage2 = *(CEditorImage**)pObject2; + + return str_comp(pImage1->m_aName, pImage2->m_aName); +} + +static int *gs_pSortedIndex = 0; +static void ModifySortedIndex(int *pIndex) +{ + if(*pIndex > -1) + *pIndex = gs_pSortedIndex[*pIndex]; +} + +void CEditor::SortImages() +{ + bool Sorted = true; + for(int i = 1; i < m_Map.m_lImages.size(); i++) + if( str_comp(m_Map.m_lImages[i]->m_aName, m_Map.m_lImages[i-1]->m_aName) < 0 ) + { + Sorted = false; + break; + } + + if(!Sorted) + { + array lTemp = array(m_Map.m_lImages); + gs_pSortedIndex = new int[lTemp.size()]; + + qsort(m_Map.m_lImages.base_ptr(), m_Map.m_lImages.size(), sizeof(CEditorImage*), CompareImageName); + + for(int OldIndex = 0; OldIndex < lTemp.size(); OldIndex++) + for(int NewIndex = 0; NewIndex < m_Map.m_lImages.size(); NewIndex++) + if(lTemp[OldIndex] == m_Map.m_lImages[NewIndex]) + gs_pSortedIndex[OldIndex] = NewIndex; + + m_Map.ModifyImageIndex(ModifySortedIndex); + + delete [] gs_pSortedIndex; + gs_pSortedIndex = 0; + } +} + void CEditor::RenderImages(CUIRect ToolBox, CUIRect ToolBar, CUIRect View) { + SortImages(); + for(int e = 0; e < 2; e++) // two passes, first embedded, then external { CUIRect Slot; diff --git a/src/game/editor/ed_editor.h b/src/game/editor/ed_editor.h index d027c162..a7d742a8 100644 --- a/src/game/editor/ed_editor.h +++ b/src/game/editor/ed_editor.h @@ -608,6 +608,7 @@ public: void RenderFileDialog(); void AddFileDialogEntry(const char *pName, CUIRect *pView); + void SortImages(); }; // make sure to inline this function -- cgit 1.4.1 From 9e6c9096248dc35a354050749b460fafdd21df7f Mon Sep 17 00:00:00 2001 From: xalduin Date: Wed, 2 Jun 2010 13:26:17 -0400 Subject: Removed unnecessary SortImages call in RenderImages --- src/game/editor/ed_editor.cpp | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/game/editor/ed_editor.cpp') diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp index df40c48a..0e478753 100644 --- a/src/game/editor/ed_editor.cpp +++ b/src/game/editor/ed_editor.cpp @@ -1874,8 +1874,6 @@ void CEditor::SortImages() void CEditor::RenderImages(CUIRect ToolBox, CUIRect ToolBar, CUIRect View) { - SortImages(); - for(int e = 0; e < 2; e++) // two passes, first embedded, then external { CUIRect Slot; -- cgit 1.4.1 From 80a7c53dec3e2fefbdf854ef32efb242662179a7 Mon Sep 17 00:00:00 2001 From: xalduin Date: Sat, 5 Jun 2010 18:46:47 -0400 Subject: Issue #92 scrollbars added for layer/image toolbars --- src/game/editor/ed_editor.cpp | 174 +++++++++++++++++++++++++++++++++--------- 1 file changed, 140 insertions(+), 34 deletions(-) (limited to 'src/game/editor/ed_editor.cpp') diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp index 35a0b03a..44620ab9 100644 --- a/src/game/editor/ed_editor.cpp +++ b/src/game/editor/ed_editor.cpp @@ -567,10 +567,7 @@ static void CallbackAppendMap(const char *pFileName, void *pUser) { CEditor *pEditor = (CEditor*)pUser; if(pEditor->Append(pFileName)) - { pEditor->m_aFileName[0] = 0; - pEditor->SortImages(); - } } static void CallbackSaveMap(const char *pFileName, void *pUser){ if(((CEditor*)pUser)->Save(pFileName)) str_copy(((CEditor*)pUser)->m_aFileName, pFileName, 512); } @@ -1045,13 +1042,13 @@ void CEditor::DoQuadPoint(CQuad *q, int QuadIndex, int v) s_Operation = OP_CONTEXT_MENU; m_SelectedQuad = QuadIndex; UI()->SetActiveItem(pId); - if(!(m_SelectedPoints&(1<KeyPressed(KEY_LSHIFT) || Input()->KeyPressed(KEY_RSHIFT)) - m_SelectedPoints |= 1<KeyPressed(KEY_LSHIFT) || Input()->KeyPressed(KEY_RSHIFT)) + m_SelectedPoints |= 1<= 0 && m_SelectedLayer < m_Map.m_lGroups[m_SelectedGroup]->m_lLayers.size()) ValidLayer = 1; + int Num = (int)(View.h/16.0f); + static int s_ScrollBar = 0; + static float s_ScrollValue = 0; + + int LayerNum = 0; + for(int g = 0; g < m_Map.m_lGroups.size(); g++) + LayerNum += m_Map.m_lGroups[g]->m_lLayers.size() + 1; + + int ScrollNum = LayerNum-Num+10; + + if(LayerNum > Num) // Do we even need a scrollbar? + { + CUIRect Scroll; + LayersBox.VSplitRight(15.0f, &LayersBox, &Scroll); + LayersBox.VSplitRight(3.0f, &LayersBox, 0); // extra spacing + Scroll.HMargin(5.0f, &Scroll); + s_ScrollValue = UiDoScrollbarV(&s_ScrollBar, &Scroll, s_ScrollValue); + + if(ScrollNum > 0) + { + if(Input()->KeyPresses(KEY_MOUSE_WHEEL_UP)) + s_ScrollValue -= 3.0f/ScrollNum; + if(Input()->KeyPresses(KEY_MOUSE_WHEEL_DOWN)) + s_ScrollValue += 3.0f/ScrollNum; + + if(s_ScrollValue < 0) s_ScrollValue = 0; + if(s_ScrollValue > 1) s_ScrollValue = 1; + } + else + ScrollNum = 0; + } + + int LayerStartAt = (int)(ScrollNum*s_ScrollValue); + if(LayerStartAt < 0) + LayerStartAt = 0; + + int LayerStopAt = LayerStartAt+Num; + int LayerCur = 0; + // render layers { for(int g = 0; g < m_Map.m_lGroups.size(); g++) { + if(LayerCur > LayerStopAt) + break; + else if(LayerCur + m_Map.m_lGroups[g]->m_lLayers.size() + 1 < LayerStartAt) + { + LayerCur += m_Map.m_lGroups[g]->m_lLayers.size() + 1; + continue; + } + CUIRect VisibleToggle; - LayersBox.HSplitTop(12.0f, &Slot, &LayersBox); - Slot.VSplitLeft(12, &VisibleToggle, &Slot); - if(DoButton_Ex(&m_Map.m_lGroups[g]->m_Visible, m_Map.m_lGroups[g]->m_Visible?"V":"H", 0, &VisibleToggle, 0, "Toggle group visibility", CUI::CORNER_L)) - m_Map.m_lGroups[g]->m_Visible = !m_Map.m_lGroups[g]->m_Visible; - - str_format(aBuf, sizeof(aBuf),"#%d %s", g, m_Map.m_lGroups[g]->m_pName); - if(int Result = DoButton_Ex(&m_Map.m_lGroups[g], aBuf, g==m_SelectedGroup, &Slot, - BUTTON_CONTEXT, "Select group. Right click for properties.", CUI::CORNER_R)) + if(LayerCur >= LayerStartAt) { - m_SelectedGroup = g; - m_SelectedLayer = 0; + LayersBox.HSplitTop(12.0f, &Slot, &LayersBox); + Slot.VSplitLeft(12, &VisibleToggle, &Slot); + if(DoButton_Ex(&m_Map.m_lGroups[g]->m_Visible, m_Map.m_lGroups[g]->m_Visible?"V":"H", 0, &VisibleToggle, 0, "Toggle group visibility", CUI::CORNER_L)) + m_Map.m_lGroups[g]->m_Visible = !m_Map.m_lGroups[g]->m_Visible; - static int s_GroupPopupId = 0; - if(Result == 2) - UiInvokePopupMenu(&s_GroupPopupId, 0, UI()->MouseX(), UI()->MouseY(), 120, 200, PopupGroup); - } + str_format(aBuf, sizeof(aBuf),"#%d %s", g, m_Map.m_lGroups[g]->m_pName); + if(int Result = DoButton_Ex(&m_Map.m_lGroups[g], aBuf, g==m_SelectedGroup, &Slot, + BUTTON_CONTEXT, "Select group. Right click for properties.", CUI::CORNER_R)) + { + m_SelectedGroup = g; + m_SelectedLayer = 0; - LayersBox.HSplitTop(2.0f, &Slot, &LayersBox); + static int s_GroupPopupId = 0; + if(Result == 2) + UiInvokePopupMenu(&s_GroupPopupId, 0, UI()->MouseX(), UI()->MouseY(), 120, 200, PopupGroup); + } + LayersBox.HSplitTop(2.0f, &Slot, &LayersBox); + } + LayerCur++; for(int i = 0; i < m_Map.m_lGroups[g]->m_lLayers.size(); i++) { + if(LayerCur < LayerStartAt || LayerCur > LayerStopAt) + { + LayerCur++; + continue; + } + //visible LayersBox.HSplitTop(12.0f, &Slot, &LayersBox); Slot.VSplitLeft(12.0f, 0, &Button); @@ -1682,14 +1735,14 @@ void CEditor::RenderLayers(CUIRect ToolBox, CUIRect ToolBar, CUIRect View) UiInvokePopupMenu(&s_LayerPopupId, 0, UI()->MouseX(), UI()->MouseY(), 120, 150, PopupLayer); } - + LayerCur++; LayersBox.HSplitTop(2.0f, &Slot, &LayersBox); } LayersBox.HSplitTop(5.0f, &Slot, &LayersBox); } } - + if(LayerCur <= LayerStopAt) { LayersBox.HSplitTop(12.0f, &Slot, &LayersBox); @@ -1701,7 +1754,7 @@ void CEditor::RenderLayers(CUIRect ToolBox, CUIRect ToolBar, CUIRect View) } } - LayersBox.HSplitTop(5.0f, &Slot, &LayersBox); + //LayersBox.HSplitTop(5.0f, &Slot, &LayersBox); } @@ -1882,14 +1935,58 @@ void CEditor::SortImages() void CEditor::RenderImages(CUIRect ToolBox, CUIRect ToolBar, CUIRect View) { + int Num = (int)(View.h/15.0f); + static int s_ScrollBar = 0; + static float s_ScrollValue = 0; + + int ImageNum = m_Map.m_lImages.size(); + int ScrollNum = ImageNum-Num+10; + + if(ImageNum > Num) // Do we even need a scrollbar? + { + CUIRect Scroll; + ToolBox.VSplitRight(15.0f, &ToolBox, &Scroll); + ToolBox.VSplitRight(3.0f, &ToolBox, 0); // extra spacing + Scroll.HMargin(5.0f, &Scroll); + s_ScrollValue = UiDoScrollbarV(&s_ScrollBar, &Scroll, s_ScrollValue); + + if(ScrollNum > 0) + { + if(Input()->KeyPresses(KEY_MOUSE_WHEEL_UP)) + s_ScrollValue -= 3.0f/ScrollNum; + if(Input()->KeyPresses(KEY_MOUSE_WHEEL_DOWN)) + s_ScrollValue += 3.0f/ScrollNum; + + if(s_ScrollValue < 0) s_ScrollValue = 0; + if(s_ScrollValue > 1) s_ScrollValue = 1; + } + else + ScrollNum = 0; + } + + int ImageStartAt = (int)(ScrollNum*s_ScrollValue); + if(ImageStartAt < 0) + ImageStartAt = 0; + + int ImageStopAt = ImageStartAt+Num; + int ImageCur = 0; + for(int e = 0; e < 2; e++) // two passes, first embedded, then external { CUIRect Slot; - ToolBox.HSplitTop(15.0f, &Slot, &ToolBox); - if(e == 0) - UI()->DoLabel(&Slot, "Embedded", 12.0f, 0); - else - UI()->DoLabel(&Slot, "External", 12.0f, 0); + + if(ImageCur > ImageStopAt) + break; + else if(ImageCur >= ImageStartAt) + { + + ToolBox.HSplitTop(15.0f, &Slot, &ToolBox); + if(e == 0) + UI()->DoLabel(&Slot, "Embedded", 12.0f, 0); + else + UI()->DoLabel(&Slot, "External", 12.0f, 0); + } + ImageCur++; for(int i = 0; i < m_Map.m_lImages.size(); i++) { @@ -1899,6 +1996,15 @@ void CEditor::RenderImages(CUIRect ToolBox, CUIRect ToolBar, CUIRect View) continue; } + if(ImageCur > ImageStopAt) + break; + else if(ImageCur < ImageStartAt) + { + ImageCur++; + continue; + } + ImageCur++; + char aBuf[128]; str_copy(aBuf, m_Map.m_lImages[i]->m_aName, sizeof(aBuf)); ToolBox.HSplitTop(12.0f, &Slot, &ToolBox); @@ -2626,7 +2732,7 @@ void CEditor::Render() View.HSplitTop(16.0f, &MenuBar, &View); View.HSplitTop(53.0f, &ToolBar, &View); - View.VSplitLeft(80.0f, &ToolBox, &View); + View.VSplitLeft(100.0f, &ToolBox, &View); View.HSplitBottom(16.0f, &View, &StatusBar); if(m_ShowEnvelopeEditor) -- cgit 1.4.1 From 2d99a0360fa4ca08525c93ba81469fb2b4cc7e72 Mon Sep 17 00:00:00 2001 From: xalduin Date: Sat, 5 Jun 2010 18:47:30 -0400 Subject: Images are now sorted on Append --- src/game/editor/ed_editor.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/game/editor/ed_editor.cpp') diff --git a/src/game/editor/ed_editor.cpp b/src/game/editor/ed_editor.cpp index 44620ab9..07761441 100644 --- a/src/game/editor/ed_editor.cpp +++ b/src/game/editor/ed_editor.cpp @@ -568,6 +568,8 @@ static void CallbackAppendMap(const char *pFileName, void *pUser) CEditor *pEditor = (CEditor*)pUser; if(pEditor->Append(pFileName)) pEditor->m_aFileName[0] = 0; + else + pEditor->SortImages(); } static void CallbackSaveMap(const char *pFileName, void *pUser){ if(((CEditor*)pUser)->Save(pFileName)) str_copy(((CEditor*)pUser)->m_aFileName, pFileName, 512); } -- cgit 1.4.1