Use a listview icon to represent expanded/collapsed state, rather than puttting '[+]'/'[-]' in front of the category name
Just use the item icon directly to represent expanded/collapsed state, rather than using a state icon as otherwise we have empty space where the item icon would be, when it's size is being used for indenting. The icons were made by tracing the previously used .bmp in Inkscape to produce a .svg, then converting that to an icon with ImageMagick using 'convert -filter point -background transparent -define icon:auto-resize' --- ListView.cc | 18 ++++++- ListView.h | 3 ++ Makefile.am | 4 +- PickCategoryLine.cc | 8 ++- PickCategoryLine.h | 1 + PickPackageLine.h | 1 + res.rc | 2 + resource.h | 2 + tree-minus.ico | Bin 0 -> 299654 bytes tree-minus.svg | 118 +++++++++++++++++++++++++++++++++++++++++ tree-plus.ico | Bin 0 -> 299671 bytes tree-plus.svg | 126 ++++++++++++++++++++++++++++++++++++++++++++ 12 files changed, 280 insertions(+), 3 deletions(-) create mode 100644 tree-minus.ico create mode 100755 tree-minus.svg create mode 100644 tree-plus.ico create mode 100644 tree-plus.svg diff --git a/ListView.cc b/ListView.cc index a555caa..0c451d1 100644 --- a/ListView.cc +++ b/ListView.cc @@ -13,6 +13,7 @@ #include "ListView.h" #include "LogSingleton.h" +#include "resource.h" #include <commctrl.h> @@ -54,6 +55,15 @@ ListView::init(HWND parent, int id, HeaderList headers) // populate with columns initColumns(headers); + + // create a small icon imagelist and assign to listview control + // (the order of images matches ListViewLine::State enum) + HIMAGELIST hImgList = ImageList_Create(GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), + ILC_COLOR32, 2, 0); + ImageList_AddIcon(hImgList, LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_TREE_PLUS))); + ImageList_AddIcon(hImgList, LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_TREE_MINUS))); + ListView_SetImageList(hWndListView, hImgList, LVSIL_SMALL); } void @@ -179,10 +189,11 @@ ListView::setContents(ListViewContents *_contents) for (i = 0; i < contents->size(); i++) { LVITEM lvi; - lvi.mask = LVIF_TEXT; + lvi.mask = LVIF_TEXT | LVIF_IMAGE; lvi.iItem = i; lvi.iSubItem = 0; lvi.pszText = LPSTR_TEXTCALLBACK; + lvi.iImage = I_IMAGECALLBACK; ListView_InsertItem(hWndListView, &lvi); } @@ -247,6 +258,11 @@ ListView::OnNotify (NMHDR *pNmHdr, LRESULT *pResult) static StringCache s; s = (*contents)[iRow]->get_text(iCol); pNmLvDispInfo->item.pszText = s; + + if (pNmLvDispInfo->item.iSubItem == 0) + { + pNmLvDispInfo->item.iImage = (int)((*contents)[pNmLvDispInfo->item.iItem]->get_state()); + } } return true; diff --git a/ListView.h b/ListView.h index b14777c..f5aa1d9 100644 --- a/ListView.h +++ b/ListView.h @@ -27,8 +27,11 @@ class ListViewLine { public: + enum class State { collapsed, expanded, nothing=-1 }; + virtual ~ListViewLine() {}; virtual const std::string get_text(int col) const = 0; + virtual State get_state() const = 0; virtual ActionList *get_actions(int col) const = 0; virtual int do_action(int col, int id) = 0; }; diff --git a/Makefile.am b/Makefile.am index b58c9b7..7c1f993 100644 --- a/Makefile.am +++ b/Makefile.am @@ -46,7 +46,9 @@ EXTRA_DIST = \ cygwin-setup.ico \ cygwin-terminal.ico \ setup.exe.manifest \ - setup64.exe.manifest + setup64.exe.manifest \ + tree-minus.ico \ + tree-plus.ico # iniparse.hh is generated from iniparse.yy via bison -d, so it needs to be # included here for proper tracking (but not iniparse.cc, since automake diff --git a/PickCategoryLine.cc b/PickCategoryLine.cc index 736e3c6..21795b2 100644 --- a/PickCategoryLine.cc +++ b/PickCategoryLine.cc @@ -26,7 +26,7 @@ PickCategoryLine::get_text (int col_num) const if (col_num == pkgname_col) { std::ostringstream s; - s << (cat_tree->collapsed() ? "[+] " : "[-] ") << cat_tree->category().first; + s << cat_tree->category().first; if (pkgcount) s << " (" << pkgcount << ")"; return s.str(); @@ -70,3 +70,9 @@ PickCategoryLine::get_actions(int col) const return al; } + +ListViewLine::State +PickCategoryLine::get_state() const +{ + return cat_tree->collapsed() ? State::collapsed : State::expanded; +} diff --git a/PickCategoryLine.h b/PickCategoryLine.h index ec160f9..6b54c3f 100644 --- a/PickCategoryLine.h +++ b/PickCategoryLine.h @@ -34,6 +34,7 @@ public: } const std::string get_text(int col) const; + State get_state() const; ActionList *get_actions(int col) const; int do_action(int col, int action_id); diff --git a/PickPackageLine.h b/PickPackageLine.h index 7d96d44..dacad28 100644 --- a/PickPackageLine.h +++ b/PickPackageLine.h @@ -30,6 +30,7 @@ public: { }; const std::string get_text(int col) const; + State get_state() const { return State::nothing; } ActionList *get_actions(int col_num) const; int do_action(int col, int action_id); private: diff --git a/res.rc b/res.rc index 27f0378..10f20ba 100644 --- a/res.rc +++ b/res.rc @@ -519,6 +519,8 @@ CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "setup.exe.manifest" IDI_CYGWIN_SETUP ICON DISCARDABLE "cygwin-setup.ico" IDI_CYGWIN ICON DISCARDABLE "cygwin.ico" IDI_CYGWIN_TERMINAL ICON DISCARDABLE "cygwin-terminal.ico" +IDI_TREE_PLUS ICON DISCARDABLE "tree-plus.ico" +IDI_TREE_MINUS ICON DISCARDABLE "tree-minus.ico" ///////////////////////////////////////////////////////////////////////////// // diff --git a/resource.h b/resource.h index 2f1036b..852bdc0 100644 --- a/resource.h +++ b/resource.h @@ -76,6 +76,8 @@ #define IDI_CYGWIN_SETUP 401 #define IDI_CYGWIN 402 #define IDI_CYGWIN_TERMINAL 403 +#define IDI_TREE_PLUS 404 +#define IDI_TREE_MINUS 405 // controls diff --git a/tree-minus.ico b/tree-minus.ico new file mode 100644 index 0000000000000000000000000000000000000000..46fd3b117b0fcaffc9c12331e4ccdd1fed9f61e1 GIT binary patch literal 299654 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 IZR_j*0p@PTA^-pY literal 0 HcmV?d00001 diff --git a/tree-minus.svg b/tree-minus.svg new file mode 100755 index 0000000..124918b --- /dev/null +++ b/tree-minus.svg @@ -0,0 +1,118 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="256px" + height="256px" + viewBox="0 0 256 256" + version="1.1" + id="SVGRoot" + inkscape:version="0.92.3 (2405546, 2018-03-11)" + sodipodi:docname="tree-minus.svg"> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.3754368" + inkscape:cx="135.00514" + inkscape:cy="129.49343" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="true" + inkscape:window-width="1680" + inkscape:window-height="1027" + inkscape:window-x="1912" + inkscape:window-y="22" + inkscape:window-maximized="1" + inkscape:grid-bbox="true" + showguides="false" + inkscape:object-nodes="true"> + <inkscape:grid + type="xygrid" + id="grid4075" /> + </sodipodi:namedview> + <defs + id="defs3756" /> + <metadata + id="metadata3759"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + id="layer1" + inkscape:groupmode="layer" + inkscape:label="layer"> + <g + id="box" + inkscape:label="box" + style="fill:#000000;fill-opacity:1" + transform="translate(8,8)"> + <rect + y="56" + x="56" + height="16" + width="144" + id="top" + style="fill:#000000;fill-opacity:1" + inkscape:label="top" /> + <rect + y="184" + x="56" + height="16" + width="144" + id="bottom" + style="fill:#000000;fill-opacity:1" + inkscape:label="bottom" /> + <rect + transform="rotate(90)" + y="-72" + x="56" + height="16" + width="144" + id="left" + style="fill:#000000;fill-opacity:1" + inkscape:label="left" /> + <rect + transform="rotate(90)" + y="-200" + x="56" + height="16" + width="144" + id="right" + style="fill:#000000;fill-opacity:1" + inkscape:label="right" /> + </g> + <g + id="symbol" + inkscape:label="symbol" + style="fill:#000000;fill-opacity:1" + transform="translate(8,8)"> + <rect + transform="rotate(90)" + y="-168" + x="120" + height="80" + width="16" + id="horiz" + style="fill:#000000;fill-opacity:1" + inkscape:label="horiz" /> + </g> + </g> +</svg> diff --git a/tree-plus.ico b/tree-plus.ico new file mode 100644 index 0000000000000000000000000000000000000000..8ee3d5fed295f1b79639845c67a86c5145cfa5c8 GIT binary patch literal 299671 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 literal 0 HcmV?d00001 diff --git a/tree-plus.svg b/tree-plus.svg new file mode 100644 index 0000000..4d2eb3f --- /dev/null +++ b/tree-plus.svg @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="256px" + height="256px" + viewBox="0 0 256 256" + version="1.1" + id="SVGRoot" + inkscape:version="0.92.3 (2405546, 2018-03-11)" + sodipodi:docname="tree-plus.svg"> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="3.359375" + inkscape:cx="84.390698" + inkscape:cy="128" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="true" + inkscape:window-width="1680" + inkscape:window-height="1027" + inkscape:window-x="1912" + inkscape:window-y="22" + inkscape:window-maximized="1" + inkscape:grid-bbox="true" + showguides="false" + inkscape:object-nodes="true"> + <inkscape:grid + type="xygrid" + id="grid4075" /> + </sodipodi:namedview> + <defs + id="defs3756" /> + <metadata + id="metadata3759"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + id="layer1" + inkscape:groupmode="layer" + inkscape:label="layer"> + <g + id="box" + inkscape:label="box" + style="fill:#000000;fill-opacity:1" + transform="translate(8,8)"> + <rect + y="56" + x="56" + height="16" + width="144" + id="top" + style="fill:#000000;fill-opacity:1" + inkscape:label="top" /> + <rect + y="184" + x="56" + height="16" + width="144" + id="bottom" + style="fill:#000000;fill-opacity:1" + inkscape:label="bottom" /> + <rect + transform="rotate(90)" + y="-72" + x="56" + height="16" + width="144" + id="left" + style="fill:#000000;fill-opacity:1" + inkscape:label="left" /> + <rect + transform="rotate(90)" + y="-200" + x="56" + height="16" + width="144" + id="right" + style="fill:#000000;fill-opacity:1" + inkscape:label="right" /> + </g> + <g + id="symbol" + inkscape:label="symbol" + style="fill:#000000;fill-opacity:1" + transform="translate(8,8)"> + <rect + y="88" + x="120" + height="80" + width="16" + id="vert" + style="fill:#000000;fill-opacity:1" + inkscape:label="vert" /> + <rect + transform="rotate(90)" + y="-168" + x="120" + height="80" + width="16" + id="horiz" + style="fill:#000000;fill-opacity:1" + inkscape:label="horiz" /> + </g> + </g> +</svg> -- 2.17.0