This is the mail archive of the cygwin-apps mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH setup 09/13] Use an icon to represent expanded/collapsed state


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]